1. 단계
자바의 정석에 따르면
this : 객체 자신을 가리키는 참조변수(객체변수) 라 한다.
그런데 그게 뭔말이지??
public class Book {
public String title;
public int price;
public String company;
public int page;
public void setTitle(String title) {
this.title = title;
}
}
위 코드의 this.title에서 this는 객체 자신을 가리키는 참조변수이다.
즉 여기서 this는 Book클래스에서 자기자신 객체인 Book을 의미한다.
그러나 아직도 "감"이 오지 않는다.
다음 아래의 코드를 보자
Person p = new Person();
p : "Person객체를 가리키는 참조변수 p" 라고 읽는다.
p와 this는 역할이 똑같다.
p는 "Person객체를 가리키는 참조변수"이다.
this는 "해당 클래스 내에서 객체 자신을 가리키는 참조변수"이다.
여기까지 이해하였다면 1단계를 완료한 것이다. 좀 더 심화를 위해서 2단계로 가보자
2. 단계
public class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if(v1.equals(v2))
System.out.println("v1번지와 v2번지는 같습니다.");
else
System.out.println("v1번지와 v2번지는 다릅니다.");
}
}
class Value {
int value;
Value(int Value){
this.value = value;
}
}
Value 객체에 대해서 equals를 오버라이딩하지 않은 상태에서 Objec클래스의 equals 메서드를 사용하는 경우이므로
"번지비교"가 된다.
그러면 아래 그림을 참고해보자
v1과 v2의 번지가 다르므로 결과는
여기까지는 쉽다.
3. 단계
다음 아래의 코드를 보자
package org.example.practice;
public class Ex9_1 {
public static void main(String[] args) {
Value v1 = new Value(10);
Value v2 = new Value(10);
if(v1.equals(v2))
System.out.println("v1번지와 v2번지는 같습니다.");
else
System.out.println("v1번지와 v2번지는 다릅니다.");
}
}
class Value {
int value;
Value(int Value){
this.value = value;
}
public boolean equals(Object obj){
return this == obj;
}
}
위 코드의 경우 value클래스에서 equals메서드를 여전히 오버라이딩하지 않고 사용하므로 "번지비교"를 하고 있다. (오버라이딩x)
일단 위 코드를 실행시켜 보면
결과는 동일하다.
그런데 뭔가 꺼림직하다.
자세히 살펴보면
일단 v1객체변수가 equals메서드를 호출하고, 그 매개변수로 v2객체변수를 대입하고 있다.
즉 obj에는 v2의 번지가 복사되어 주소값이 전달된다.
호출된 equals메서드에서는 this ==obj 되있으므로 주소비교를 한다.
v2의 주소가 파라미터로 넘어 왔기 때문에
this == v2 가 된다.
그러면 여기서 this는 어떤 애란 말인가??
아래 그림을 보자
추가사항: this는 "객체 생성시 최초 한번만 생성된다."
위 그림에서 보면
- this는 100번지이고, v1도 100번지이다.
- v1은 equals메서드를 호출하고 매개변수로 v2 번지를 파라미터로 넘겼다.
- equals메서드 내에서 this == v2가 된다.
- v1주소를 this에 복사한 적은 없다.
this가 100번이고, v1도 100번지이다.
따라서
equals메서드 내에서
실제적으로는 this(100번지) ==v2(200번지) 를 비교했지만
v1(100번지) ==v2(200번지) 를 비교한 것과 동일하므로
결과는
가 나온다.
그래서 결론
- this는 해당 클래스 내에서 객체자신(Value객체)을 가리키는 참조변수이며,
- v1은 해당 클래스가 아닌 다른 클래스에서 객체(Value객체)를 가리키는 참조변수이다.
- 그런데 this와 v1이 value라는 동일객체를 가리키고 있으므로 주소값이 같다.
- "this와 v1이 같다는 말"은 주소값이 100번지로 같다는 의미이다.
- 하지만 v1주소값을 this에 대입하지는 않았다
비유는 하자면,
int a = 10; a를 this라고 봄
int b = 10; b를 v1이라고 봄
a와 b는 동일한 10값을 저장하고 있다.
따라서 a와 b는 그 값이 같다. (a == b )
하지만 b(v1)을 a(this)에 대입하지는 않았다. a(this)=b(v1)
'자바 > Java (중요하고, 이해 안 되고, 어려운)' 카테고리의 다른 글
Comparable (0) | 2022.10.27 |
---|---|
생성자 (0) | 2022.10.26 |
객체변수와 객체 (0) | 2022.10.26 |
자바 - 익명클래스★★ (0) | 2022.10.26 |
컬렉션 프레임워크 - Set(자바의 정석 기초편 참고) (0) | 2022.10.26 |