ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • equals 와 hashcode
    Develop/Java 2022. 8. 16. 16:54

     

    Hash 란?

    • 임의의 길이를 갖는 데이터를 고정된 길이의 데이터로 변환(매핑)하는 것
    • abcd 라는 문자열이 있다면 이를 특정 길이(ex 256bit, 512bit...)의 데이터로 변환시킨다는 것 (Hashing 이라고 함)
    • 해시함수를 돌리기 전 문자열의 길이가 얼마건 일정한 길이를 얻는다.
    • 변환한 데이터를 다이제스트 라고 한다.

    Hash를 사용하는 이유?

    • 특정 값에 대한 다이제스트는 변하지 않기 때문에 이 다이제스트의 값을 배열의 위치(index)로 활용 (검색 속도 빠름)
    • 동일한 메세지(값)에 대해서는 동일한 다이제스트를 갖기 때문에 중복을 허용하지 않는다. (HashSet의 기본 개념)

     

    HashCode()

    • 자바에서는 hashCode() 메소드를 활용하여, 객체의 주소값을 이용하여 해시 알고리즘에 의해 생성 된 고유의 정수값을 반환한다. 즉, 객체가 같은 메모리 주소를 가리키고 있다면 같은 정수값을 얻는다.
    • hashcode() 메소드의 반환값은 int형인데
            TestClazz t1 = new TestClazz();
            TestClazz t2 = new TestClazz();
    
            TestClazz t3 = t1;
    
            System.out.println("t1 : " + t1.hashCode());
            System.out.println("t2 : " + t2.hashCode());
            System.out.println("t3 : " + t3.hashCode());

     

    결과


    t1 : 2023938592
    t2 : 195615004
    t3 : 2023938592

     

    equals()란?

    • boolean equals(Object obj)로 정의된 equals 메소드는 2개의 객체가 동일한지 검사하기 위해 사용
    • 2개의 객체가 가리키는 곳이 동일한 메모리 주소일 경우에만 동일한 객체가 된다.
    • String 클래스에서는 동일한 문자열을 2개 생성하면 서로 다른 메모리 상에 할당된다. 하지만 equals를 사용하면 true인 이유는 String 클래스에서 equals 메소드를 오버라이드하여 문자를 비교하는 코드를 추가했기 때문이다.
    public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            return (anObject instanceof String aString)
                    && (!COMPACT_STRINGS || this.coder == aString.coder)
                    && StringLatin1.equals(value, aString.value);
        }

     

    eqauls와 hashcode의 관계

    • 동일한 객체는 동일한 메모리 주소를 갖기 때문에, 동일한 객체는 동일한 hashCode를 가진다.
    • equals() 메소드를 오버라이드 할 때, hashCode() 메소드도 오버라이드 되어야 한다.
    • equals() 메서드로 같은 객체는 같은 hashCode() 결과가 나와야 한다.
    • hashCode() 메서드로 같은 객체가 항상 equals() 메서드로 같은 객체는 아니다.

     

     

    출처

    https://mangkyu.tistory.com/101

    https://studyandwrite.tistory.com/475

     

    댓글

Designed by Tistory.