본문 바로가기

Java의 정석

객체 지향 개념 - 15 this()

1. Car(String c, String g, int d) {
    color = c;
    gearType = g;
    door = d;
}

2. Car(String color, String gearType, int door) {
    this.color = color;
    this.gearType = gearType;
    this.door = door;
}

위에서 1번 코드의 'color = c;'는 생성자의 매개변수로 선언된 지역변수 c의 값을 인스턴스 변수 color에 저장한다. 이때 변수 color와 c는 이름만으로도 서로 구별되므로 아무런 문제가 없다.

 

그러나 2번 코드에서처럼 생성자의 매개변수로 선언된 변수의 이름이 color로 인스턴스 변수 color와 같을 경우에는 이름만으로는 구별이 안되므로 인스턴스 변수 앞에 'this'를 사용하면 된다. 이러면 this.color는 인스턴스 변수이고 color는 생성자의 매개변수로 정의된 지역변수로 서로 구별이 가능하다. 만일 2번 코드에서 'color = color'와 같이 했다면 둘 다 지역변수로 간주된다.

 

생성자의 매개변수로 인스턴스변수들의 초기값을 제공받는 경우가 많기 때문에 매개변수와 인스턴스 변수의 이름이 일치하는 경우가 자주 있는데 2번 코드와 같이 매개변수 이름을 다르게 하는 것보다 'this'를 사용해서 구별되도록 하는 것이 의미가 더 명확하고 이해하기 쉽다.

 

'this'는 참조변수로 인스턴스 자신을 가리킨다. 참조 변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 'this'로 인스턴스 변수에 접근할 수 있는 것이다.

'this'를 사용할 수 있는 것은 인스턴스멤버뿐이며 static 메서드에서는 인스턴스 멤버들을 사용할 수 없는 것처럼, 'this'역시 사용할 수 없다. static 메서드는 인스턴스를 생성하지 않고도 호출될 수 있으므로 호출된 시점에 인스턴스가 존재하지 않을 수도 있기 때문이다.

 

생성자를 포함한 모든 인스턴스메서드에는 자신이 관련된 인스턴스를 가리키는 참조 변수 'this'가 지역변수로 숨겨진 채로 존재한다.

 

  • this - 인스턴스 자신을 자리키는 참조 변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채 존재한다.
  • this(), this(매개변수) - 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.