안 씀/java-개념

this 레퍼런스, 객체 치환

unhyepnhj 2024. 5. 14. 16:40

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() 는 반드시 같은 클래스 내 다른 생성자를 호출할 때 사용

- 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()를 이용하여 수정

4-4

더보기

 

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는 각각 "춘향전", "작자미상"으로 초기화