본문 바로가기
C#

C# 기초 - 레퍼런스, 생성자 this

by 고체물리학 2021. 5. 15.

1. 레퍼런스 this

- 자기 자신의 인스턴스 주소가 자동으로 저장되는 참조 변수(레퍼런스 변수)
- 메서드(또는 생성자) 내에서 로컬변수와 멤버 변수(인스턴스 변수)의 이름이 같을 경우
- 멤버변수를 가리키기 위해 사용하는 키워드
- 동일한 클래스 내의 this 키워드를 사용하면 인스턴스마다 다른 주소를 가리키게 됨

 

 <기본 사용법 >

this.멤버변수명

 

ex)

using System;

namespace Test
{
    public class Program
    {

        static void Main(string[] args)
        {
            // Student 인스턴스 생성, 이름 : 홍길동, 나이 : 20 출력
            Student s = new Student();
            s.name = "홍길동";

            s.setName("홍길동"); // this.name = name 에서 this 는 Student 인스턴스(s)
            Console.WriteLine("이름 : " + s.getName());

            Console.WriteLine("---------------------");

            Student s2 = new Student();
            s2.name = "이순신";

            s2.setName("이순신"); // this.name = name 에서 this 는 Student 인스턴스(s2)
            Console.WriteLine("이름 : " + s2.getName());


        }
    }
    class Student
    {
        public String name;
        public int age;

        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            // 메서드 내에서 멤버변수(name)와 로컬변수(name)의 이름이 같을 경우
            // 변수명 name 을 지정하면 로컬변수를 가리키게 된다
            // 따라서, name = name; 코드는 로컬변수 값을 로컬변수 자신에게 대입하는 코드가 되므로
            // 아무런 효과가 없는 코드가 된다
            // name = name; // 로컬변수 값을 로컬변수에 대입하는 코드

            // 로컬변수(name) 값을 멤버변수(name)에 저장하려면
            // 멤버변수 name 앞에 레퍼런스 this 를 사용해야한다 (this.name 형태로 멤버변수 지정)
            this.name = name;
        }

        public int getAge()
        {
            // 멤버변수만 있고 로컬변수가 없어서 이름이 중복되지 않는 경우에는
            // 멤버변수 앞에 this 를 생략할 수도 있고, 붙일 수도 있다
            return this.age; // return age; 와 동일한 코드
        }

        public void setAge(int age)
        {
            // 멤버변수 age 와 로컬변수 age 가 이름이 동일하므로
            // 멤버변수 age 앞에 레퍼런스 this 가 필수
            this.age = age;
        }

    }
    
}

<출력 결과>

 

2. 생성자 this()

- 자기 자신의 또 다른 생성자를 호출하는 키워드
- 생성자 오버로딩 시 코드의 중복이 발생하는데, 코드 중복 제거를 위해 하나의 생성자에서 모든 작업을 처리하고 나머지 생성자는 해당 생성자를 호출하여 값만 전달하면 코드 중복이 제거될 수 있다


< 기본 문법 >
: this()를 사용

 

ex)

using System;

namespace Test
{
    public class Program
    {

        static void Main(string[] args)
        {
            Student2 s1 = new Student2();
            Console.WriteLine("이름 : " + s1.name + ", 나이 : " + s1.age);

            Student2 s2 = new Student2("이순신");
            Console.WriteLine("이름 : " + s2.name + ", 나이 : " + s2.age);

            Student2 s3 = new Student2("아무개", 30);
            Console.WriteLine("이름 : " + s3.name + ", 나이 : " + s3.age);


        }
    }
    class Student2
    {
        public String name;
        public int age;

        // Student2() 생성자 정의 - 이름(name)은 홍길동, 나이(age)는 0으로 초기화
        public Student2()
        {

            // Student2(String, int) 생성자를 호출하여 대신 초기화 작업 수행
            this.name = "홍길동";
            this.age = 0;
            Console.WriteLine("Student2() 생성자 호출됨!");

        }

        // Student2(String) 생성자 정의 - 이름(name) 전달받아 초기화, 나이(age)는 0으로 초기화
        public Student2(String name): this()
        {

            this.name = name;
            Console.WriteLine("Student2(String) 생성자 호출됨!");
        }

        // Student2(String, int) 생성자 정의 - 이름(name), 나이(age) 전달받아 초기화
        public Student2(String name, int age): this()
        {
            this.name = name;
            this.age = age;
            Console.WriteLine("Student2(String, int) 생성자 호출됨!");
        }

    }
}

<출력 결과>

반응형

댓글