[Java] Object Class

nathan·2022년 2월 23일
0

JAVA

목록 보기
42/45

Object Class

  • 모든 클래스의 최고 조상. 오직 11개의 메서드만을 가지고 있다.
  • notify(), wait() 등은 쓰레드와 관련된 메서드이다.(여기서는 다루지 않음)
Object 클래스의 메서드설명
protected Object clone()객체 자신의 복사본을 반환
public boolean equals(Object obj)객체 자신과 객체 obj가 같은 객체인지 비교
protected void finalize()객체가 소멸될 때 가비지 컬렉터에 의해 자동적으로 호출
이 때 수행되어야 하는 코드가 있을 때 오버라이딩한다.
(거의 사용 X - Java9부터는 사용 불가)
finalize 더 알아보기
public Class getClass()객체 자신의 클래스 정보를 담고 있는 Class 인스턴스를 반환
Class : 클래스 정보를 담기위한 클래스(일종의 설계도 객체)
public int hashCode()객체 자신의 해시코드를 반환
public String toString()객체 자신의 정보를 문자열로 반환

equals(Object obj)

  • 객체 자신(this)과 주어진 객체(obj)를 비교 (같으면 true, 다르면 false)
  • Object 클래스의 equals()는 객체의 주소를 비교 (참조변수 값 비교)
public boolean equals(Object obj){
   return (this == obj);
}
  • 만약에 객체 주소비교가 아닌 인스턴스 변수를 비교하기 위해서는 메서드를 오버라이딩해서 사용하면 된다.
    • 클래스 변수는 객체 공통으로 가지고 있기 때문에 비교할 필요가 없겠죠?
    • Example
      // Object의 equals()를 오버라이딩해서 주소가 아닌 value를 비교
      @Override
      public boolean equals(Object obj){
         // 참조 변수의 형변환 전에는 반드시 instanceof로 확인해야한다.
         if(!(obj instanceof Value)){
            return false;
         }
         
         Value v = (Value)obj; // 형변환을 해주어야 한다. - 다형성
         return this.value == v.value;
      }

hashCode()

  • 객체의 해시코드(hash code)를 반환하는 메서드
    • 해시코드는 객체의 지문이라고도 한다.(객체마다 다른 값을 반환하므로)
  • Object 클래스의 hashCode()는 객체의 주소를 int로 변환해서 반환
public class Object{
	...
    public native int hashCode(); //native 메서드 : OS의 메서드(C언어) 
    //Java가 아닌 언어를 Java처럼 쓸 수 있게 해주는 메서드
}
  • equals()를 오버라이딩하면, hashCode()도 오버라이딩해야 한다.
    • equals()의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문!

    • 주소가 아닌 인스턴스 변수의 비교를 하기 때문에 hashCode()가 같은 값이 나오게 된다.

      String str1 = new String("abc");
       String str2 = new String("abc");
      
       System.out.println(str1.equals(str2)); // true
       System.out.println(str1.hashCode()); // 96354
       System.out.println(str2.hashCode()); // 96354
    • System.identityHashCode(Object obj)는 Object 클래스의 hashCode() 와 동일

      • 객체마다 다른 해시코드를 반환
      • hashCode() 오버라이딩 하기 전의 값이라고 보면 된다.
      System.out.println(System.identityHashCode(str1)); // 3526198
      System.out.println(System.identityHashCode(str2)); // 7699183
public class Main {
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";
        // 같은 객체가 됨. String을 new String으로 만들지 않는 것과 차이가 있다.
        System.out.println(System.identityHashCode(str1)); // 1163157884
        System.out.println(System.identityHashCode(str2)); // 1163157884
    }
}
  • 64bit JVM으로 바뀌면서 주소 값이 8비트로 표현이 되는데, 현재에도 hashCode() 메서드는 int로 관리가 되기 때문에 4비트로 표현이 되고 있다.

    • 이로 인하여 겹치는 값이 이전보다 더 많이 발생할 수 있다.
  • 참고 : String 클래스의 equals()

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

toString(), toString()의 오버라이딩

  • toString() : 객체를 문자열(String)으로 변환하기 위한 메서드
public String toString() { // Object 클래스의 toString()
   return getClass().getName()+"@"+Integer.toHexString(hashCode());

}
  • 자주 오버라이딩 되어 사용된다.

Reference

profile
나는 날마다 모든 면에서 점점 더 나아지고 있다.

0개의 댓글