Java의 정석
객체 지향 개념 - 14 this()
donghyeob.k
2022. 3. 18. 20:10
생성자에서 다른 생성자 호출하기 - this()
아래 조건을 만족시키면 생성자 간에도 서로 호출이 가능하다.
- 생성자의 이름으로 클래스이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
Car(String color) {
door = 5;
Car(color, "auto", 4);
}
위 코드는 생성자를 작성할 때 지켜야 하는 조건을 모두 만족시키지 못해 에러가 발생한다.
- 생성자의 두 번째 줄에서 다른 생성자 호출함.
- this(color, "auto", 4);로 해야 됨
생성자 내에서 다른 생성자를 호출할 때는 클래스 이름인 'Car'대신 'this'를 사용해야 하는데 그러지 않아서 에러이고, 또 다른 에러는 생성자 호출이 첫 번째 줄이 아닌 두 번째 줄이기 때문에 에러이다.
생성자에서 다른 생성자를 첫 줄에서만 호출이 가능하도록 한 이유는 생성자 내에서 초기화 작업 도중에 다른 생성자를 호출하게 되면, 호출된 다른 생성자 내에서도 멤버 변수들의 값을 초기화를 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해질 수 있기 때문이다.
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;
}
}
class thisExam {
public static void main(String[] args) {
Car2 c1 = new Car2();
Car2 c2 = new Car2("blue");
System.out.println("c1 : " + c1.color + ", " + c1.gearType + ", " + c1.door);
System.out.println("c2 : " + c2.color + ", " + c2.gearType + ", " + c2.door);
// c1 : white, auto, 4
// c2 : blue, auto, 4
}
}
생성자 Car2()에서 또 다른 생성자 Car2(String color, String gearType, int door)를 호출하였다. 이처럼 생성자 간의 호출에는 생성자의 이름 대신 this를 사용해야만 하므로 'Car2' 대신 'this'를 사용했으며 첫 줄에서 호출하였다.
같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아서 이처럼 서로 호출하도록 하여 유기적으로 연결해주면 더 좋은 코드를 얻을 수 있고 수정이 필요한 경우보다 적은 코드만을 변경하면 되므로 유지보수가 쉬워진다.