일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- http
- hashcode
- 객체지향언어
- 개발자기술면접
- 백엔드면접
- 자바기술면접
- 자바
- 백엔드
- 공유락
- Application
- jpa
- equals
- java
- 기술면접대비
- 자바면접
- 개발자면접
- 기술면접
- 운영체제
- 배타락
- 면접준비
- 스프링
- DB
- 자바8
- 스트림
- 네트워크
- stream
- 데이터베이스
- 알고리즘
- Spring
- lock
Archives
- Today
- Total
서은파파의 추월차선
[Java] equals와 hashCode는 왜 함께 재정의해야 할까요? 본문
728x90
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);
}
}
}
왜 이런 현상이 발생하나요? 🤔
해시값을 사용하는 자료구조는 hashCode 메서드의 반환값을 사용하는데요. hashCode 메서드의 반환 값이 일치한 이후 equals 메서드의 반환값 참일 때만 논리적으로 같은 객체라고 판단합니다. 위 예제에서 Subscribe 클래스는 hashCode 메서드를 재정의하지 않았기 때문에 Object 클래스의 기본 hashCode 메서드를 사용합니다. Object 클래스의 기본 hashCode 메서드는 객체의 고유한 주소를 사용하기 때문에 객체마다 다른 값을 반환합니다. 따라서 2개의 Subscribe 객체는 다른 객체로 판단되었고 HashSet에서 중복 처리가 되지 않았습니다.
728x90
'면접대비' 카테고리의 다른 글
[백엔드/면접] 동기 방식으로 외부 서비스를 호출할 때 외부 서비스 장애가 나면 어떻게 조치할 수 있나요? (0) | 2025.02.11 |
---|---|
[Java/면접] 동일성과 동등성에 대해서 (0) | 2025.02.08 |
[백엔드/면접] 로그와 메트릭을 설명해주세요 (0) | 2025.02.05 |
[자바/Java/면접] JVM의 구조와 동작 원리 (0) | 2025.01.19 |
개발자 기술면접질문지 리스트(Java, Network, OS, DB) (0) | 2025.01.12 |