객체를 비교할 때 equals와 hashcode

‍bng4535·2023년 2월 25일

equals()

equals() 메서드는 기본적으로는 두 객체의 참조(주소) 값을 비교한다. 따라서, 두 객체의 내용이 같더라도 참조 값이 다르면 equals()는 false를 반환하게 된다.
그러나, equals() 메서드를 오버라이딩하여 두 객체의 내용(content)이 같은지를 비교하도록 변경할 수 있다. 이때, 객체의 내용이 같으면 참조 값이 달라도 true를 반환하게 된다. 따라서, 객체를 구분하는 기준이 내용(content)이 되며, 객체의 동일성 판단 기준이 내용(content)으로 변경된다.

hashcode()

Object클래스의 hashcode() 메서드는 객체의 해시코드(hash code)를 반환하는 메서드이다. 해시코드는 객체를 식별하는 정수값으로, 객체의 메모리 주소를 바탕으로 계산된다. 따라서, 내용이 같은 두 객체는 항상 같은 해시코드를 갖게 된다.

@Override
public int hashCode() {
    int result = 17;
    result = 31 * result + // first field
             ((field1 == null) ? 0 : field1.hashCode());
    result = 31 * result + // second field
             ((field2 == null) ? 0 : field2.hashCode());
    // and so on for each remaining field
    return result;
}

해시 값이 다르다면 두 객체가 다른 객체임을 보장하지만, 해시 값이 같다고 무조건 같은 객체는 아니다. 이를 해시 충돌이라 한다.

hashcode() 메서드는 객체를 해시 테이블(hash table)에 저장하거나 검색할 때 사용된다. 객체의 해시코드를 계산하여, 해당 객체를 저장할 위치를 찾아내는 데 사용된다. 해시 테이블은 매우 빠른 검색 속도를 제공하므로, 많은 양의 데이터를 다룰 때 유용하다.

equals()와 hashcode()의 관계

equals()와 hashcode() 메서드는 서로 밀접한 관계를 가지고 있다. hash를 이용한 자료구조의 ( HashSet, HashMap, HashTable) 경우 가장 먼저 hashCode()의 결과를 비교하여 같다면 equals()를 실행하여 내용이 같은지 확인하기 때문이다. 따라서 equals()를 수정했다면 hashCode()의 수행결과도 같은 값이 나오도록 변경해 주어야 한다.

profile
공부 기록

0개의 댓글