minOS

자바의 정석 ch9-1~3 Object 클래스와 equals() 본문

TIL/남궁성의 자바의 정석

자바의 정석 ch9-1~3 Object 클래스와 equals()

minOE 2024. 9. 25. 12:15
728x90

ch9-1 Object클래스

- 모든 클래스의 최고 조상 , 11개의 메서드만을 가지고 있다.
- notify(),wait() 등은 쓰레드와 관련된 메서드이다.
- 이 클래스는 java.lang 패키지에 속해 있으며, 모든 객체가 공통으로 가져야 할 기본적인 메서드들을 제공합니다.

 

 

ch9-2  equals(Object obj)

 - 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true 다르면 false.
 - Object 클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)
public boolean equals(Object obj) {
    if (this == obj) {
        return true; //주소가 같으면 true
    }
    // 추가 내용
}​



예제

class Value{
    int value;

    Value(int value){
        this.value =value;
    }
}


public class Ex9_1 {
    public static void main(String[] args) {
        Value v1 = new Value(10);
        Value v2 = new Value(10);

        System.out.println(v1.equals(v2)); //false 반환

    }
}


출력결과

객체v1,v2의 주소값이 다르기 때문에 false를 반환한다. 이를 그림으로 표현해보면

힙 메모리
    +----------------------------------+
    |                                  |
    |  +----------------------------+  |
    |  | Value 객체                 |  |
v1 --->| 주소: 0x1234ABCD           |  |
    |  | value: 10                  |  |
    |  +----------------------------+  |
    |                                  |
    |  +----------------------------+  |
    |  | Value 객체                 |  |
v2 --->| 주소: 0x5678EFGH           |  |
    |  | value: 10                |  |
    |  +----------------------------+  |
    |                                  |
    +----------------------------------+

스택 메모리
+----------------------------------+
| v1 (참조변수)                    |
| 값: 0x1234ABCD                   |
+----------------------------------+
| v2 (참조변수)                    |
| 값: 0x5678EFGH                   |
+----------------------------------+

 

서로 다른 두 객체의 주소값은 항상 다르다.

 

ch9-3  equals(Object obj)의 오버라이딩

- 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩해야 한다.

equals 오버라이딩해서 주소가 아닌 인스턴스를 비교하게 바꾸면
class Value {
    int value;

    Value(int value) {
        this.value = value;
    }

    public boolean equals(Object obj) {
        //  return this == obj ; 주소비교 ,서로 다른 객체는 항상 거짓
        // 참조변수의 형변환 전에는 반드시 instanceof로 확인해야함

        if (!(obj instanceof Value)) return false;

        Value v = (Value) obj;
        return this.value == v.value;
    }
}

public class Ex9_2 {
    public static void main(String[] args) {
        Value v1 = new Value(10);
        Value v2 = new Value(10);

        System.out.println(v1.equals(v2)); //true

    }
}​​

출력결과

메모리 구조

메모리
+----------------------------------+
|                                  |
|  Value 인스턴스 v1               |
|  주소: 0x1000                    |
|  +----------------------------+  |
|  | value: 10                  |  |
|  +----------------------------+  |
|                                  |
|  Value 인스턴스 v2               |
|  주소: 0x2000                    |
|  +----------------------------+  |
|  | value: 10                  |  |
|  +----------------------------+  |
|                                  |
+----------------------------------+​

 

equals() 메서드 비교 과정
v1.equals(v2) 호출
    |
    v
+----------------------------------+
|                                  |
|  1. instanceof 검사              |
|     obj instanceof Value: true   |
|                                  |
|  2. 형변환                       |
|     Value v = (Value) obj        |
|                                  |
|  3. 값 비교                      |
|     this.value == v.value        |
|     10 == 10  ✓                  |
|                                  |
|  결과: true                      |
|                                  |
+----------------------------------+​
728x90