1. this() : 같은 클래스의 다른 생성자 호출
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다.
단, 다음의 두 조건을 만족시켜야 한다.
- 생성자의 이름으로 클래스이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
// 잘못된 생성자 생성
Car(String color) {
door = 5;
Car(color, "auto", 4); // 에러1. 생성자의 두 번째 줄에서 다른 생성자 호출
// 에러2. this(color, "auto", 4);로 사용해야 함
}
// 제대로 된 생성자 생성
Car(String color) {
this(color, "auto", 4);
}
다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유
→ 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문!
2. this : 인스턴스 자신을 가리키는 참조변수
생성자 안에서 인스턴스변수와 매개변수의 이름을 일치시키고 싶다면?
this를 사용하면 구별할 수 있다.
// 일반적인 생성자 생성
Car(String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
// this를 사용한 생성자 생성
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
this는 참조변수로 인스턴스 자신을 가리킨다. 참조변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼, this로 인스턴수 변수에 접근할 수 있는 것이다.
생성자의 매개변수로 인스턴스변수들의 초기값을 제공받는 경우가 많기 때문에 매개변수와 인스턴스변수의 이름이 일치하는 경우가 자주 있다. 이때는 this를 사용해서 구별하는 게 좋다.
- static에서도 this를 사용할 수 있을까?
불가능하다. static메서드(클래스 메서드)가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문에.
static메서드에서는 인스턴스 멤버들을 사용할 수 없는 것처럼!
3. this()와 this의 차이
- this(), this(매개변수)
생성자, 같은 클래스의 다른 생성자를 호출할 때 사용
- this
인스턴스 자신을 가리키는 참조변수. 인스턴스의 주소가 저장되어 있다.
* this()와 this는 비슷하게 생겼지만 완전히 다른 것이다.
참고문헌 : 남궁성(2016), Java의 정석, 도우출판