본문 바로가기
카테고리 없음

equals, hashcode를 재정의 하는 이유

by cook_code 2023. 10. 16.
반응형

equals() 메서드

해당 메서드는 대상1 객체와 대상2 객체의 동등성과 동일성을 비교합니다.

※ 동등성 비교: 객체 내부의 값만 비교
※ 동일성 비교: 객체의 참조값(주소값)과 객체 내부의 값이 모두 일치하는지 비교

equals() 메서드 값 비교

hashcode() 메서드

해당 메서드는 실행 후 리턴된 대상1 객체와 대상2 객체의 해시코드값이 일치하는지 비교합니다.

※ 해시코드: 객체를 식별하는 하나의 정수값
※ 주소값: 메모리상에 객체가 저장된 위치

Object의 hashcode() 메소드는 객체의 메모리 번지를 이용해서 해시코드를 만들어 리턴하기 때문에 객체마다 다른값을 가집니다.

이미지 출처:  지수의 콘텐츠 기록장

위 예시를 보면 해시코드는 같지만 K1과 K2의 주소는 서로 다르기 때문에 equals() 메서드는 false를 반환합니다.

동일성 여부
hashcode() 값 O
equals() 값 X

equals, hashcode를 재정의 하는 이유

hashcode()를 재정의 하지 않으면 같은 값이라도 다른 해시값이 부여될 수 있어 값 비교가 정확하지 않고,
equals()를 재정의 하지 않으면 비교하려는 객체간의 주소값 비교가 불가하기 때문에 null을 리턴하게 됩니다.

항상 hashCollection을 사용하는 것은 아니지만 코드의 수정을 최소화하기 위해 미리 재정의 하는 것이 좋습니다.

추가로 생각해볼 것

equals() 메서드의 실행 결과가 참이면 hashcode() 메서드의 실행결과도 참일까?
그 반대의 경우는 어떨까?

[X값을 5로 나누는 예제] ▼

더보기

 

0 % 5 = 0이고 5 % 5 = 0 인데

0 % 5 == 5 % 5  : 결과값은 같지만

0 != 5 : 대상값이 다르다. 

참고 블로그

https://velog.io/@rg970604/JAVA-Equals%EC%99%80-HashCode%EB%A5%BC-%EC%9E%AC%EC%A0%95%EC%9D%98%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

반응형