코린이의 소소한 공부노트

생성자 this() vs 참조변수 this 본문

Java

생성자 this() vs 참조변수 this

무지맘 2022. 3. 12. 16:01

자바에서 객체를 많이 다루다 보면 this를 심심치 않게 만날 수 있다. 생성자 this()와 참조변수 this가 있는데, 이름만 같을 뿐 완전 별개의 일을 하니 이번 기회에 확실히 짚고 넘어가자.

 

생성자 this()

  - 같은 클래스 내의 매개변수의 개수가 같은 생성자를 호출한다.

  - 이때 클래스 이름 대신 this를 쓴다.

  - 다른 생성자 호출시 첫 줄에서만 사용 가능하다.

// Time 클래스 내부의 생성자

Time(int h){ // 매개변수 1개
    hour = h;
}

Time(int h, int m){ // 매개변수 2개
    hour = h;
    minute = m;
}

Time(int h, int m, int s){ // 매개변수 3개
    hour = h;
    minute = m;
    second = s;
}

Time(){
    second = 0; // 필요 없지만 써봤다..
    this(12, 0, 0); // 매개변수가 3개인 생성자를 호출하려는데..
    // error: Constructor call must be the first statement in a constructor
} // 에러를 해결하려면 second = 30; 삭제

기본 생성자를 이용해 객체를 생성할 때 아무 작업도 하지 않으면 해당 타입의 기본값으로 초기화가 되기 때문에 Time 객체의 기본값은 0시 0분 0초일 것이다. 그런데 나는 12시 0분 0초로 초기화하고 싶어서 위의 기본 생성자처럼 코드를 작성한 것이다. this가 있다면 위의 예시처럼 1줄이면 끝나지만, this가 없다면 아래처럼 써야 한다.

Time(){
    hour = 12;
    minute = 0;
    second = 0;
}

위의 예시를 봐서 알겠지만, this()를 사용하는 가장 큰 이유는 코드 중복 제거를 위한 것이다.

 

이번에는 다른 this에 대해 알아볼 차례다. 참조변수 this

  - 인스턴스 자신을 가리키는 참조변수로

  - 인스턴스 메서드(생성자 포함)에서 사용 가능하다. 이 말인즉슨, 스태틱 메서드에서는 사용 불가다.

  - lv와 iv를 구별할 때 사용한다.

Time(int h, int m, int s){
    hour = h;
    minute = m;
    second = s;
}

위의 생성자는 매개변수 3개를 받아 그 값을 iv에 저장하는 역할을 한다. 여기서 hour, minute, second는 iv이고 h, m, s는 lv이다. 그런데 만약 lv와 iv의 이름이 똑같다면 어떻게 써야 할까?

Time(int hour, int minute, int second){
    this.hour = hour;
    this.minute = minute;
    this.second = second;
}

iv 앞에 this를 붙여 lv와 구별해서 사용하면 된다. 이상할 것도 없는 게, 원래 객체의 iv에 접근할 때 참조변수.변수이름으로 썼었다. this가 객체 자신을 가리키는 참조변수이니 더더욱 이상할 것이 없다!

 

생성자 this()와 참조변수 this에 대한 종합 예시를 살펴보겠다.

class Mathfunc {
    // iv
    int a, b; // 원래 이름은 this.a, this.b

    // 생성자 #1
    Mathfunc(int a, int b) {
        this.a = a;
        this.b = b;
    } // 여기 this를 생략하면 lv와 iv의 이름이 중복되므로 에러발생
    
    // 생성자 #2
    Mathfunc(){
        this(10, 10);
    } // 1번 생성자를 호출 해 this.a, this.b에 각각 10, 10 대입
    
    // im
    int add() {
        return a+b; // return this.a + this.b;
    }

    // sm
    static int add(int a, int b) {
        return a+b;
    } // 여기 a, b는 lv. 스태틱 메서드는 iv 사용불가 -> this 사용불가
}

- 생성자 this()는 같은 클래스 내의 다른 생성자를 호출하기 위한 것으로, 클래스 이름 대신 this를 사용한다.

- 참조변수 this는 인스턴스 자신을 가리키는 참조변수로, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재하기 때문에 선언하지 않아도 사용 가능하다. 생성자, im에서는 사용 가능하지만, sm에서는 사용 불가하다.

 

 

 

'Java' 카테고리의 다른 글

클래스 간의 관계 - 상속, 포함  (0) 2022.03.15
변수의 초기화  (0) 2022.03.12
생성자  (0) 2022.03.12
메서드 오버로딩  (0) 2022.03.09
스태틱/인스턴스 메서드  (0) 2022.03.07