본문 바로가기
프로그래밍/JAVA

자바의 정석 기초 (Object 클래스 / equals(Object obj) / equals(Object obj)오버라이딩)

by ✲ 2020. 7. 20.
반응형

남궁성님의 자바의 정석 기초편을 보면서 혼자 공부하는 공간입니다. 참고 부탁드립니다. 

Object 클래스 

- 모든 클래스의 최고 조상. 오직 11개의 메서드만 가지고 있다. 

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

 

equals(Object obj)

- 객체 자신(this)과 주어진 객체(obj)를 비교한다. (같으면 true, 다르면 false) 

- Object클래스의 equals()는 객체의 주소를 비교 (참조변수 값 비교) 

public boolean equals(Ojbect obj){
    return (this ==obj);
}

 

equals(Object obj)의 오버라이딩

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

class Person {
    long id;

    public boolean equals(Object obj){
        if(obj instanceof Person)  //obj가 Object타입이므로 id값을 참조하기 위해서는 Person타입으로 형변환 필요 
            return id == ((person)obj).id;     
        else
            return false;                           // 타입이 Person이 아니면 값을 비교할 필요도 없다. 

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

}

 

 

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
31
32
33
34
 
public class Ex9_1 {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        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;
    }
}
 
cs
반응형

댓글