java/객체지향

[객체지향] this()와 this

각시탈코더 2021. 7. 12. 15:44

●생성자에서 다른 생성자 호출하기 - this()

 

 같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다. 단 아래와 같이 두가지 조건을 만족해야 한다.

  1. 생성자의 이름으로 클래스이름 대신 this를 사용한다.
  2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

 

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'가 지역변수로 숨겨진 채로 존재한다.

 

출처:자바의 정석 기초편(저자: 남궁성, 출판사:도우출판)