본문 바로가기

개발

Java - Object 클래스

반응형

Object 클래스
 - 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.
 - notify(), wait() 등은 쓰레드와 관련된 메서드이다.

메서드 설명
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(Object obj)
 - 객체 자신과 주어진 객체를 비교한다. 같으면 true 다르면 false.
 - Object클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)
 **오버라이딩 해서 값을 비교 하는 함수를 만든다.

package obj;

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

    public boolean equals(Object obj){

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

        Value v = (Value) obj;

        return this.value == v.value;

    }
}
public class ValueMain {
    static public void main(String[] args){
        Value v1 = new Value(1);
        Value v2 = new Value(1);

        if(v1.equals(v2)){
            System.out.println("같음");
        }else {
            System.out.println("다름");
        }
    }
}

 

hashCode()
 - 객체의 해시코드를 반환하는 메서드
 - Object클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
 - equals()를 오버라이딩 하면, hashCode()도 오버라이딩 해야한다.
  equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문

public class Object{
	...
    public native int hashCode();
    // native : 네이티브 메서드 : OS의 메서드(C언어)
 	...   
}

** 근데 반환형이 int 형이다 
    32비트에서는 4바이트가 주소값 
    64비트에서는 8바이트가 주소값 >> 8 바이트에서 앞에 4바이트를 잘라서 형변환 시키기 때문에 >> 값이 같은 것이 나올 수 있다.
- 참고 : System.identityHashCode(Object obj)는 Object 클래스의 hashCode()와 동일 


toString()
 - 객체를 문자열로 변환하기 위한 메서드
   오버라이딩 해서 사용 할 수 도 있다.

public String toString(){
	return getClass().getName()+"@"+Integer.toHexString(hashCode());
  }

 

equals(), toString(), hashCode() 구현

package obj;

import java.util.Objects;

public class CardMain {
    static public void main(String[] args){
        Card v1 = new Card(1, "A");
        Card v2 = new Card(1, "B");
        Card v3 = new Card(1, "B");

        System.out.println(v1.equals(v2));
        System.out.println(v3.equals(v2));

        System.out.println(v1.hashCode());
        System.out.println(v1.toString());
    }
}

class Card {
    int value;
    String name;
    Card(int value, String name){
        this.value = value;
        this.name = name;
    }

    public boolean equals(Object obj){

        if(!(obj instanceof Card)){
            return false;
        }

        Card v = (Card) obj;

        return this.value == v.value && this.name.equals(v.name);

    }

    public int hashCode(){
        return Objects.hash(name, value); 
    }

    public String toString(){
        return "name:"+this.name+", value:"+this.value;
    }

}
반응형

'개발' 카테고리의 다른 글

Java - StringBuffer 클래스  (0) 2021.06.05
Java - String 클래스  (0) 2021.06.05
Java - 오류 / 예외 처리하기  (0) 2021.06.05
Java - 내부 클래스(inner class) / 익명 클래스(anonymous class)  (0) 2021.06.05
Java - 인터페이스  (0) 2021.06.05