Object

ymk·2023년 6월 15일
0
post-thumbnail

📦 Object 클래스

Object 클래스는 모든 클래스의 최고의 조상이다. 따라서 Object 클래스의 멤버들은 모두 클래스에서 바로 사용 가능하다.

Object 클래스는 멤버변수는 없으며 오직 11개의 메서드를 가지고 있다. 이 메서들은 모든 인스턴스가 가져야 할 기본적인 것들이다. 여기서 이번에는 equals()hashcode()에 대해서 알아 볼 예정이다.

Object 클래스의 메서드

💡 equals(Object obj)

equals() 메서드의 실제 내용은 다음과 같이 되어있다.

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

this는 인스턴스 자신을 가리키는 참조변수이다. 즉 인스턴스의 주소가 저장되어 있는 것이다.
equals()는 매개변수로 비교할 객체의 참조변수를 받아서 두 객체의 같고 다름을 참조변수의 값으로 비교하고 그 결과를 boolean 값으로 알려주는 역할을 한다.

  • 동일성: 말그대로 "동일" 하다는 뜻으로 두 객체가 완전히 같은 경우를 말한다(같은 주소). Object 클래스의equals()가 재정의를 하지 않는 이상 == 와 같은 동일성 비교를 하는 것이다. 하지만 primitve type의 == 비교는 예외로 값 비교가 가능하다.

  • 동등성: 동등성은 두 개의 객체가 같은 정보를 갖고 있는 경우를 뜻한다. 변수가 참조하고 있는 주소값이 서로 달라도 값만 같으면 두 변수는 동등하다고 한다. String 의 Override 된 equals() 를 예로 들 수 있다.

java.lang.String.equals()

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
    }

💡 hashCode()

hashCode() 메서드는 해싱(hashing) 기법에 사용되는 "해시함수(hash function)"을 구현한 것이다. 해싱은 데이터 관리기법 중의 하나로 다량의 데이터를 저장하고 검색하는데에 유용하다. 해시 함수는 찾고자하는 값을 입력하면, 그 값이 저장된 위치를 알려주는 해시코드(hashcode)를 반환한다.
따라서hashCode()는 객체의 주소값으로 해시코드를 만들어 반환한다. 하지만 아주 낮은 확률로 같은 해시코드가 만들어질 수도 있기 때문에 equals 메서드와 혼용해서 쓰는 것이 좋다.
hashCode() 또한 값으로 비교할 수 있도록 Override가 가능하다. StringhashCode도 역시 그렇게 Override 되어 있다.

class Ex1{
	public static void main(String[] args) {
    	String str1 = new String("Hello");
        String str2 = new String("Hello");
        
        System.out.println(str1.equals(str2)); // true
        System.out.println(str1.hashCode()); // 45123
        System.out.println(str2.hashCode()); // 45123
        System.out.println(System.identityHashCode(str1)); // 23498723
        System.out.println(System.identityHashCode(str2)); // 1242148
    }

}

System.identityHashCode()는 Object 클래스의 hashCode() 처럼 주소값을 이용하여 해시코드를 생성한다.


Reference

Java의 정석 - 3rd Edition by. 남궁 성

https://dlsdn73.tistory.com/365

profile
개발 공부 일지

0개의 댓글