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'를 사용했으며 첫 줄에서 호출하였다.

 

같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아서 이처럼 서로 호출하도록 하여 유기적으로 연결해주면 더 좋은 코드를 얻을 수 있고 수정이 필요한 경우보다 적은 코드만을 변경하면 되므로 유지보수가 쉬워진다.