●생성자에서 다른 생성자 호출하기 - this()
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다. 단 아래와 같이 두가지 조건을 만족해야 한다.
- 생성자의 이름으로 클래스이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
Car(String color) {
door = 5;
Car(color, "auto", 4); //error
}
위의 코드는 두 가지의 조건을 모두 지키지 않았기 때문에 오류가 발생했다. Car(String color)생성자 안에 Car(color, "auto", 4) 생성자를 첫 번째 줄이 아닌 두 번째 줄에 사용했으며, 생성자의 이름을 this가 아닌 Car로 생성했다. 생성자를 첫 줄에 사용하도록 한 이유는 생성자 내에서 초기화 작업도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버변수들의 값을 초기화를 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이다.
class Car2 {
String color;
String gearType;
int door;
Car2() {
this("white", "auto", 4); //Car2(String color, String gearType, int door) 호출
}
Car2(String color) {
this(color, "auto", 4) //Car2(String color, String gearType, int door) 호출
}
Car2(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
●객체 자신을 가리키는 참조변수 - this
Car(String c, String g, int d) {
color = c; // color는 iv, c는 lv
gearType = g;
door = d;
}
위의 코드는 생성자 Car의 인스턴스 변수(color)와 지역변수(c)는 서로 다르기 때문에 에러가 나지 않는다. 만약 인스턴스 변수와 지역변수가 같아지면 어떻게 될까?
Car(String color, String g, int d) {
color = color; //iv와 lv 구별 x
gearType = g;
door = d;
}
코드를 보는 바와 같이 무엇이 인스턴스 변수이고 지역변수인지 구별할 수 없다. 자바는 'color = color'를 모두 지역변수로 간주해버린다.이를 해결하기 위해 'this'를 사용하여 인스턴스 변수와 지역변수를 구별한다.
Car(String color, String gearType, int door) {
this.color = color; // this.color는 iv, color는 lv
this.gearType = gearType;
this.door = door;
'this'를 사용하면 this.color는 인스턴스 변수이고 color는 생성자의 매개변수로 정의된 지역변수로 서로 구별이 가능해진다. 그런데 'this'를 사용할 수 있는 것은 인스턴스 멤버뿐이다. static메서드(클래스 메서드)에서는 인스턴스 멤버들을 사용할 수 없는 것처럼, 'this' 역시 사용할 수 없다. 왜냐하면, static 메서드는 인스턴스를 생성하지 않고도 호출될 수 있으므로 static 메서드가 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문이다. 사실 생성자를 포함한 모든 인스턴스메서드에는 자신이 관련된 인스턴스를 가리키는 참조변수 'this'가 지역변수로 숨겨진 채로 존재한다.
출처:자바의 정석 기초편(저자: 남궁성, 출판사:도우출판)
'java > 객체지향' 카테고리의 다른 글
[객체지향] 상속 (0) | 2021.07.13 |
---|---|
[객체지향] 변수, 멤버변수의 초기화 (0) | 2021.07.12 |
[객체지향] 생성자 (0) | 2021.07.12 |
[객체지향] 오버로딩(overloading) (0) | 2021.07.09 |
[객체지향] 메서드 간의 호출과 참조 (0) | 2021.07.09 |