객체는 기본값을 쓰면 주소로 비교된다.
내용이 같아도 다른 개체로 인식된다.
equals() 를 재정의하면 반드시 hashCode() 도 같이 고쳐야 한다.

1. 기본 동작 이해하기
class Person {
String name;
}
Person a = new Person();
a.equals(b); // 주소 비교로 false
기본 equals() 는 메모리 주소를 비교한다.
내용이 같아도 주소가 다르면 false 가 된다.
재정의하지 않으면 내용 비교는 불가능하다.
2. hashCode() 의 역할
Map<Person, String> map = new HashMap<>();
Person p1 = new Person();
p1.name = "홍길동";
map.put(p1, "홍길동");
해시맵은 키를 넣어둘 때 해시값을 계산한다.
equals() 가 다르면 같은 객체로 보지 않는다.
hashCode() 를 올바르게 구현하지 않으면, equals() 로 같다고 판단되는 객체들이 해시맵 내에서 올바르게 검색되지 않을 수 있다.
3. 재정의 시 주의점
class Person {
String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
equals() 를 고치면 hashCode() 도 반드시 맞춰야 한다.
같은 내용을 가진 객체는 같은 해시값을 가져야 한다.
규칙을 지키지 않으면 해시맵에서 오류가 발생한다.
4. 실수하기 쉬운 경우
class BadPerson {
String name;
@Override
public boolean equals(Object o) {
if (o instanceof Person) return true; // 너무 느슨함
return false;
}
// hashCode() 는 재정의 안 함 -> 기본값 사용
}
equals() 가 너무 넓으면 해시맵이 깨진다.
hashCode() 를 안 고치면 같은 값도 다른 박스에 들어간다.
검색할 때 올바른 결과를 얻지 못하게 된다.
'개념 창고 > JAVA' 카테고리의 다른 글
| [CS] 뮤텍스(Mutex)와 세마포어(Semaphore) 차이 (0) | 2026.10.24 |
|---|---|
| [Java] 추상 클래스와 인터페이스 차이 (0) | 2026.10.16 |
| [Java] 문자열(String) 비교시 equals()와 == 차이 (0) | 2024.07.30 |
| [Java] Unsigned int 구현 방법 (0) | 2024.01.31 |
| 자바 메모리 영역(Method, Stack, Heap) (0) | 2023.01.17 |