this 레퍼런스, 객체 치환
this: 현재 실행되고 있는 메소드가 속한 객체에 대한 레퍼런스
- 컴파일러에 의해 자동 관리
- this.멤버 형태로 사용
public class Circle{
int raidus;
public Cirle(int r){ this.radius = r; }
public int getRadius(){ return radius; }
}
- this는 현재 객체에 대한 레퍼런스이므로, this.radius는 현재 객체의 멤버 radius에 접근한다.
this의 필요성
1. 객체의 멤버 변수와 메소드 변수의 이름이 같은 경우
public Circle(int radius){ radius=radius; }
- 이렇게 작성할 경우 radius=radius;의 두 radius가 모두 Circle(int radius)의 매개변수 radius를 접근
public Circle(int radius){ this.radius = radius; }
- 이 경우 위와 같이 작성하면 됨
- this.radius는 멤버 radius를, radius는 매개변수 radius를 접근
2. 메소드가 객체 자신의 레퍼런스를 리턴하는 경우
public Circle getMe(){ return this; } //getMe() 메소드는 객체 자신의 레퍼런스를 리턴

this()로 다른 생성자 호출
this(): 클래스 내에서 생성자가 다른 생성자를 호출할 때 사용하는 코드
- 클래스 내의 다른 생성자 호출
- 생성자 내에서만 사용 가능
- 반드시 생성자 코드의 제일 처음에 수행
this 사용 시 주의할 점
- this() 는 반드시 생성자 코드에서만 호출 가능
- this() 는 반드시 같은 클래스 내 다른 생성자를 호출할 때 사용
- this() 는 반드시 생성자의 첫 번째 문장
객체 치환 시 주의할 점: 객체의 치환은 객체를 복사하는 것이 아님
Circle ob1 = new Circle(1);
Circle ob2 = new Circle(2);
//2개의 Circle 객체 생성
- 다음 라인을 실행하면, ob2의 레퍼런스가 레퍼런스 s에 치환(=대입)
- s는 ob2가 가리키는 객체를 함께 가리키게 됨
ob1 = ob2;
- 위 객체 치환 문장 실행 시 ob1의 레퍼런스가 ob2의 레퍼런스와 동일해짐
- ob2의 객체를 함께 가리키게 됨
- ob1이 원래 가리키던 객체는 아무도 가리키지 않아 프로그램에서 접근할 수 없는 상태가 됨 → 가비지(garbage)
- 가비지는 자바 가상 기계에 의해 자동으로 수거, 재사용

예제 4-5 예제 4-4에서 작성한 Book 클래스의 생성자를 this()를 이용하여 수정


1. Book loveStory = new Book("춘향전"); 에서 new가 실행될 때 Book(String title){ } 생성자가 호출
2. 생성자의 title에 "춘향전" 이 전달
3. 생성자는 this(title, "작자미상") 문을 실행
4. 이 this() 문은 2개의 변수를 가진 Book(String title, String number){ } 생성자를 다시 호출
5. 이 생성자에 의해 멤버 title과 author는 각각 "춘향전", "작자미상"으로 초기화