객체를 식별하기 위해서 해시 알고리즘에 의해 생성된 정수값
엄말히 말하면 해시코드는 주소값은 아니고, 주소값으로 만든 고유한 숫자값
객체의 메모리 번지
(객체의 주소 값)를 이용해서 해시 코드를 만들어 리턴하기 떄문에 객체 마다 다른 값을 가지고 있다.오버라이딩
(재정의)할 필요성이 있다.public class Main {
public static void main(String[] args) {
Person p1 = new Person("홍길동");
Person p2 = new Person("홍길동");
// 객체 인스턴스마다 각기 다른 주해시코드(주소))를 가지고 있다.
System.out.println(p1.hashCode()); // 622488023
System.out.println(p2.hashCode()); // 1933863327
}
}
위 그림에서 세객체는 서로 같은 해시값을 갖는다
따라서 hashcode() 메서드는 같은 값을 리턴하지만, 서로 값이 다른 객체이기 때문에 equals() 메서드는 false 리턴
HashTable 뿐만 아니라 HashMap, HashSet 모두 동작 원리가 동일하다
이처럼 같은 해시값의 버킷 안에 다른 객체가 있는 경우 equals 메서드가 사용되는 것
EqualsAndHashCode를 사용하는 이유
만약 equals()와 hashCode()중 하나만 재정의 하면,
이러한 이유로 객체의 정확한 동등 비교를 위해서는 특히 Hash 관련 컬렉션 프레임워크를 사용할 때는 Object의 equals() 메소드만 재정의하지 말고 hashcode()메소드도 재정의해서 논리적 동등 객체일 경우 동일한 해시코드가 리턴되도록 해야한다.
참고
- https://tecoble.techcourse.co.kr/post/2020-07-29-equals-and-hashCode/
- https://brunch.co.kr/@mystoryg/133
- https://jisooo.tistory.com/entry/java-hashcode%EC%99%80-equals-%EB%A9%94%EC%84%9C%EB%93%9C%EB%8A%94-%EC%96%B8%EC%A0%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C
- https://inpa.tistory.com/entry/JAVA-%E2%98%95-equals-hashCode-%EB%A9%94%EC%84%9C%EB%93%9C-%EA%B0%9C%EB%85%90-%ED%99%9C%EC%9A%A9-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0