equals와 hashCode는 왜 함께 재정의해야 할까?
●equals와 hashCode는 왜 함께 재정의해야 할까?
equals와 hashCode 메서드는 객체의 동등성 비교와 해시값 생성을 위해서 사용할 수 있지만, 함께 재정의하지 않는다면 예상치 못한 결과를 만들 수 있음
해시값을 사용하는 자료구조(HashSet, HashMap..)을 사용할 때 문제가 발생할 수 있음
class EqualsHashCodeTest {
@Test
@DisplayName("equals만 정의하면 HashSet이 제대로 동작하지 않는다.")
void test() {
// 아래 2개는 같은 구독자
Subscribe subscribe1 = new Subscribe("team.maeilmail@gmail.com", "backend");
Subscribe subscribe2 = new Subscribe("team.maeilmail@gmail.com", "backend");
HashSet<Subscribe> subscribes = new HashSet<>(List.of(subscribe1, subscribe2));
// 결과는 1개여야하는데..? 2개가 나온다.
System.out.println(subscribes.size());
}
class Subscribe {
private final String email;
private final String category;
public Subscribe(String email, String category) {
this.email = email;
this.category = category;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Subscribe subscribe = (Subscribe) o;
return Objects.equals(email, subscribe.email) && Objects.equals(category, subscribe.category);
}
}
}
●왜 이런 현상이 발생할까?