Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

Object 클래스와 equals(), equals(Object obj)의 오버라이딩 본문

Java/JAVA2

Object 클래스와 equals(), equals(Object obj)의 오버라이딩

빌드이너프 2023. 6. 25. 22:11

Object 클래스

모든 클래스의 최고 조상

오직 11개의 메서드만을 가지고 있다

 

notify(), wait()등은 쓰레드와 관련된 메서드

protected로 되어있는 것들은 오버라이딩 후 public으로 변경해야한다

Object 클래스의 메서드 설명
protected Object clone() 객체 자신의 복사본을 반환한다
public boolean equals(Object obj) 객체 자신과 객체 obj가 같은 객체인지 알려준다(같으면 true)
protected void finalize() 객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출된다
이때 수행되어야 하는 코드가 있을 때 오버라이딩한다(거의 사용 안함)
public Class getClass() 객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환한다
public int hashCode() 객체 자신의 해시코드를 반환한다
public String toString() 객체 자신의 정보를 문자열로 반환한다
public void notify() 객체 자신을 사용하려고 기다리는 쓰레드를 하나만 깨운다
public void notifyAll() 객체 자신을 사용하려고 기다리는 모든 쓰레드를 깨운다
public void wait()
public void wait(long timeout)
public void wait(long timeout, int nanos)
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간(timeout, nanos)동안 기다리게한다
[timeout은 천 분의 1초, nanos는 10^9분의 1초)

 

 

equals()

객체 자신(this)와 주어진 객체(obj)를 비교한다

반환타입 boolean: 같으면 true, 다르면 false

public boolean equals(Object obj) {
    return (this==obj); // 주소가 같아야 true
}

 

 

결과: false

class equalsTest {
    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;
    }
}

v1과 v2는 다르다

서로 다른 두 객체는 항상 주소가 다르다

 

 

결과: true

obj에는 value가 없기 떄문에 형변환 필수

주소비교: 서로 다른 객체는 항상 거짓 나옴(서로 다른 객체라도 비교한 결과가 참이고 싶으면 형변환 후 여기서는 value라는 값으로 비교해야한다)

또한 참조변수의 형변환 전에는 반드시 instanceof로 확인을 해야한다

class equalsTest {
    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;
    }

    // Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교
    public boolean equals(Object obj) {
        // return this==obj; // 주소비교, 서로 다른 객체는 항상 거짓
        // 참조변수의 형변환 전에는 반드시 instanceof로 확인하기
        if(!(obj instanceof Value)) return false;
        Value v = (Value)obj; //obj에는 value가 없기 떄문에 형변환 필수

        return this.value==v.value;
    }
}

v1과 v2는 같다

 

 

equals(Object obj)의 오버라이딩

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

class variable: 객체마다 공통(공유)

instance variable: 객체마다 다름(개별)

obj가 Object 타입이므로 id 값을 참조하기 위해서 Persion 타입으로 형변환이 필요하다

class Person {
    long id; // this.id

    public boolean equals(Object obj) {
        if (obj instanceof Person)
            return id == ((Person)obj).id;
            // return this.id == ((Person)obj).id;
        else
            return false;
    }

    Person(long id) {
        this.id = id;
    }
}

public class equalsOverriding {
    public static void main(String[] args) {
        Person p1 = new Person(8011081111222L);
        Person p2 = new Person(8011081111222L);

        if(p1.equals(p2))
            System.out.println("p1과 p2는 같다");
        else
            System.out.println("p1과 p2는 다르다");
    }
}

p1과 p2는 같다

 

if문 변경: else 제거

class Person {
    long id; // this.id

    public boolean equals(Object obj) {
        if (!(obj instanceof Person))
            return false;
        
        Person p = (Person)obj;
        
        return id == p.id;
        // return this.id == p.id;
    }

    Person(long id) {
        this.id = id;
    }
}

public class equalsOverriding {
    public static void main(String[] args) {
        Person p1 = new Person(8011081111222L);
        Person p2 = new Person(8011081111222L);

        if(p1.equals(p2))
            System.out.println("p1과 p2는 같다");
        else
            System.out.println("p1과 p2는 다르다");
    }
}

p1과 p2는 같다

'Java > JAVA2' 카테고리의 다른 글

String 클래스의 생성자와 메서드  (0) 2023.06.26
String 클래스, 문자열 비교, 빈 문자열  (0) 2023.06.26
toString(), toString()의 오버라이딩  (0) 2023.06.25
hashCode()  (0) 2023.06.25
연결된 예외(chained exception)  (0) 2023.06.25