6.5 this 키워드와 this() (The 'this' Keyword)
객체 지향 프로그래밍에서 생성자나 매개변수의 이름이 클래스의 멤버 변수 이름과 같은 경우가 매우 빈번하게 발생합니다. 이런 상황에서 '어떤 것이 인스턴스 자신의 변수인지'를 명확하게 구분하기 위해 자바는 this 관련 키워드를 제공합니다.
1. 참조변수 this
this는 인스턴스 자기 자신을 가리키는 참조변수 입니다. 인스턴스의 주소가 저장되어 있으며, 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재합니다.
가장 흔한 사용처는 전역 변수(인스턴스 변수)와 지역 변수(매개변수)의 이름이 같을 때 이를 구분하기 위한 목적입니다.
class Car {
String color; // 인스턴스 변수
int door; // 인스턴스 변수
// 매개변수의 이름(color, door)과 인스턴스 변수의 이름이 같음!
Car(String color, int door) {
// color = color; // 이렇게 쓰면 둘 다 지역 변수(매개변수)로 취급되어 값이 저장되지 않음
this.color = color; // this.color는 인스턴스 변수, = color는 매개변수를 의미
this.door = door;
}
}
- 주의점:
this는 인스턴스 멤버(변수나 메서드)에만 사용할 수 있습니다.static이 붙은 클래스 메서드에서는 인스턴스가 존재하지 않을 수도 있으므로this를 사용할 수 없습니다.
2. 생성자 호출 this()
this()는 같은 클래스의 다른 생성자를 호출할 때 사용하는 특별한 명령어입니다. 생성자끼리 코드가 중복되는 것을 방지하기 위해 사용됩니다.
- 규칙 1:
this()를 통한 생성자 호출은 반드시 생성자의 ** 첫 줄**에서만 호출이 가능합니다. - 규칙 2: 메서드가 아닌 생성자 내부에서만 사용할 수 있습니다.
class Car {
String color;
String gearType;
int door;
// 기본 생성자
Car() {
// 첫 줄에서 또 다른 생성자 Car(String, String, int)를 호출
this("white", "auto", 4);
}
Car(String color) {
this(color, "auto", 4);
}
// 진짜 데이터 저장을 수행하는 메인 생성자
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
위의 코드처럼 작성하면, 기능의 중복을 막고 가장 매개변수가 많은 생성자 하나에만 변수 초기화 코드를 집중시켜 유지보수성을 극대화할 수 있습니다.
요약
this: 객체(인스턴스) 자신을 가리키는 참조 변수. 멤버 변수 식별용.this(): 같은 클래스 내의 다른 생성자를 호출 하는 함수형 키워드. 코드 중복 방지용.