equals()와 hashCode()는 Java에서 객체의 동등성(equality) 비교와 해싱(hashing) 을 위해 사용되는 중요한 메서드다.
equals()는 객체의 논리적 동등성을 비교하고, hashCode()는 객체의 해시 코드를 반환한다.
1. equals() 메서드:
- 역할: 두 객체가 논리적으로 같은지 비교한다. 즉, 두 객체가 동등한(equivalent) 지를 판단한다.
- 기본 구현: Object 클래스에 정의된 equals() 메서드는 객체의 참조(reference)를 비교. 즉, 두 객체가 동일한 메모리 주소를 가리키고 있는지 확인한다.
- 재정의(Overriding): 객체의 참조가 아닌 내용(필드 값)을 기반으로 동등성을 비교하려면 equals() 메서드를 재정의해야 한다. 예를 들어, String 클래스는 문자열의 내용이 같으면 true를 반환하도록 equals()를 재정의되어있다.
- 사용:
- 객체의 논리적 동등성 비교
- List, Set과 같은 컬렉션에서 객체의 포함 여부 확인
- Map에서 키의 동등성 비교
2. hashCode() 메서드:
- 역할: 객체의 해시 코드(hash code) 를 반환한다. 해시 코드는 객체를 고유하게 식별하는 정수 값이다.
- 기본 구현: Object 클래스에 정의된 hashCode() 메서드는 객체의 메모리 주소를 기반으로 해시 코드를 생성한다.
- 재정의(Overriding): equals() 메서드를 재정의한 경우, hashCode() 메서드도 반드시 재정의해야 한다.
즉, 기존의 equlas()에서 객체의 주소를 기준으로 동등한지 비교했고 , hashCode() 에서도 객체의 주소를 가지고 해시값을 만들었으니 , equlas()의 기준이 필드값이 같은지로 바뀌었을때 hashCode()에서도 필드값을 통해 해시값을 리턴해야한다 - 사용:
- 해시 테이블(Hash Table) 과 같은 해시 기반 자료구조(e.g., HashMap, HashSet)에서 객체를 저장하고 검색하는 데 사용됨.
equals()와 hashCode()의 관계 (일반 규약):
- equals()가 true를 반환하는 두 객체는 hashCode()도 같은 값을 반환해야 한다.
- 즉, 논리적으로 동등한 객체는 동일한 해시 코드를 가져야 한다.
- hashCode()가 같은 값을 반환하더라도, equals()는 false를 반환할 수 있다.
- 즉, 해시 코드가 같다고 해서 두 객체가 반드시 논리적으로 동등한 것은 아닙니다(해시 충돌).
(해시의 특성상 희박한 확률로 다른 객체가 같은 해시값을 가질 수 있다.)
- 즉, 해시 코드가 같다고 해서 두 객체가 반드시 논리적으로 동등한 것은 아닙니다(해시 충돌).
equals()와 hashCode() 재정의 시 주의사항:
- 일관성(Consistent): 객체의 상태가 변경되지 않았다면, equals()와 hashCode()는 항상 같은 결과를 반환해야 한다.
- 대칭성(Symmetric): a.equals(b)가 true이면, b.equals(a)도 true여야 한다.
- 추이성(Transitive): a.equals(b)가 true이고 b.equals(c)가 true이면, a.equals(c)도 true여야 한다.
- 반사성(Reflexive): a.equals(a)는 항상 true여야 한다.
- null 처리: a.equals(null)은 항상 false여야 한다.
- hashCode() 재정의: equals()를 재정의하면 반드시 hashCode()도 재정의해야 한다.
- 성능: hashCode()는 가능한 한 빠르고 균등하게 해시 코드를 분배하도록 구현해야 한다.
equals()와 hashCode() 재정의 예시:
Java
public class Person {
private String name;
private int age;
// ... (생성자, getter/setter 등) ...
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
'개발 > Java' 카테고리의 다른 글
예외 (0) | 2025.03.27 |
---|---|
java.time (0) | 2025.03.14 |
java.util.Date (0) | 2025.03.14 |
Enum 타입 (0) | 2025.03.05 |
[Java] 자바 객체와 관련된 용어 정리 (0) | 2025.01.24 |