본문 바로가기

프로그래밍/Java

Java_java.lang패키지와 유용한 클래스(1)_Object클래스의 메서드

① Object클래스

: 모든 클래스의 최고 조상.

모든 클래스의 최고조상이기 때문에 Object클래스의 멤버들은 모든 클래스에서 바로 사용 가능하다. 

 

- Object클래스의 메서드

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 timout)
public void wait(long timeout, int nons)
다른 쓰레드가 notify()나 notifyAll()을 호출할 때까지 현재 쓰레드를 무한히 또는 지정된 시간동안 기다리게 한다. 

→ protected로 선언된 메서드들은 오버라이딩을 해서 public으로 변경시켜야 한다. 

 

 

- Object클래스의 메서드 equals()

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

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

class JavaJungsuk_javalangPackage_Ex9_1 {
    public void 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는 다릅니다.

→ equals()메서드는 객체의 주소를 비교하여 같으면 true, 다르면 false를 반환하기 때문에 

서로 다른 두 객체는 항상 주소가 다르므로 'v1과 v2는 다릅니다.'를 반환한다. 

 

 

- euqlas()의 오버라이딩

: 만약 주소값이 같은지를 판단하는 기능이 아닌 서로의 인스턴스가 가지고 있는 값을 비교하도록 하고 싶다면 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(long id) {
        this.id=id;
    }
}
class JavaJungsuk_javalangPackage_Ex9_2 {
    public static void main(String[] args) {
        Person p1=new Person(12122122121L);
        Person p2=new Person(12122122121L);
        
        if(p1.equals(p2))
            System.out.println("p1과 p2는 같은 사람입니다.");
        else
            System.out.println("p1과 p2는 다른 사람입니다.");
    }
}

결과
p1과 p2는 같은 사람입니다.

→ if문에서 instanceof를 사용하여 형변환 여부를 확인하고 true이면 id==((Person)obj).id를 반환한다. 그리고 형변환이 되지 않는다면 flase를 반환하게 한다. 위 예제에서는 p1이 id이고 p2가 형변환된 id이다. 

 

 

- Object클래스의 메서드 hashCode()

: 객체의 해시코드(hash code)를 반환하는 메서드

Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환. (정수값)

class JavaJungsuk_javalangPackage_Ex9_3 {
    public static void main(String[] args) {
        String str1=new String("abc");
        String str2=new String("abc");
        
        System.out.println(str1.equals(str2));
        System.out.println(str1.hashCode());
        System.out.println(str2.hashCode());	//같은 해시코드 반환.
        System.out.println(System.identityHashCode(str1));
        System.out.println(System.identityHashCode(str2));	//객체마다 다른 해시코드 반환.
    }
}
결과
true
96354
96354
27134973
1284693

→ equals()를 오버라이딩 하면 hashCode()도 오버라이딩 해야한다.

왜냐하면 equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문이다.

 

 

- Object클래스의 메서드 toString()

: 객체를 문자열로 변환하기 위한 메서드이다.

class Card {
    String kind;
    int number;
    
    Card() {
        this("SPADE", 1);
    }
    
    Card(String kind, int number) {
        this.kind=kind;
        this.number=number;
    }
}

class JavaJungsuk_javalangPackage_Ex9_4 {
    public static void main(String args[]) {
        Card c1=new Card();
        Card c2=new Card();
        
        System.out.println(c1.toString());
        System.out.println(c2.toString());
    }
}

결과
Card@19e0bfd
Card@139a55

→ Card클래스에서 Object클래스로부터 상속받은 toString()을 오버라이딩 하지 않았기 때문에 Card인스턴스에 toString()을 호출하면, Object클래스의 toString()이 호출된다.

 

 

- toString()의 오버라이딩

class Card2 {
    String kind;
    int number;
    
    Card2() {
        this("SPADE", 1);
    }
    
    Card2(String kind, int number) {
        this.kind=kind;
        this.number=number;
   }
   
   public String toString() {
        return "kind : "+kind+", number: "+number;
   }
}

class JavaJungsuk_javalangPackage_Ex9_5 {
    public static void main(String[] args) {
        Card2 c1=new Card2();
        Card2 c2=new Card2("HEART", 10);
        
        System.out.println(c1.toString());
        System.out.println(c2.toString("HEART", 10);
    }
}

결과
kind : SPADE, number : 1
kind : HEART, number : 10

→ 위 예제처럼 toString()을 오버라이딩하여 Card2인스턴스의 kind와 number를 문자열로 반환한다.