본문 바로가기
BACKEND/JAVA

equals()와 hashCode()의 역할 및 오버라이딩 시 주의사항

by 콩밍디 2023. 12. 12.

1. equals() 메서드와 hashCode() 메서드의 차이점

equals() 메서드는 객체의 값의 일치여부(boolean)을 반환하는 타입이고,

hashCode() 메서드는 객체의 주소값(int)을 이용하여 객체 고유의 해시코드를 리턴하는 함수이다.

 

euqlas() 메서드와 hashCode() 메서드의 차이점

1. 사용 목적
equals()

두 객체가 논리적으로 동일한지를 확인하는 데 사용된다. 즉, 두 객체의 내용이 같은지를 비교한다.

hashCode()

객체의 해시 코드 값을 반환하는 데 사용된다. 해시 코드는 일반적으로 객체가 저장되는 자료구조에서 빠른 검색을 위해 활용된다.

 

2. 시나리오
equals()

주로 두 객체의 내용이 같은지 확인하는데 사용되며, 논리적인 동등성 비교에 활용한다.

예를 들어, 두 객체가 같은 값을 가지는 경우 equals()는 true를 반환해야 한다.

hashCode()

주로 해시 기반 자료구조(예: HashMap, HashSet)에서 객체를 식별하는 데 사용된다.

객체의 해시 코드가 서로 다르면 서로 다른 버킷에 저장된다.

 

3. 오버라이딩 여부
equals()

필요에 따라 클래스에서 오버라이딩될 수 있다. 오버라이딩하지 않으면 Object 클래스의 기본 구현이 사용된다.
hashCode()

equals()를 오버라이딩한 경우에만 의미가 있다. hashCode()를 오버라이딩하지 않으면 서로 다른 객체라도 동일한 해시 코드를 반환할 수 있다.

 

4. 관련성
equals()와 hashCode()는 함께 사용되어야 한다.

동일한 객체는 동일한 해시 코드를 가져야 하며, 논리적으로 동등한 객체는 equals()가 true를 반환하고 해시 코드도 동일해야 한다.

 

 

2. hashCode()와 equals() 메서드를 오버라이딩할 때 주의할 점

1. 일관성 유지
equals()가 두 객체를 동등하다고 판단한다면, 두 객체의 hashCode() 값은 동일해야 한다.

 

2. 동일한 객체일 때 동일한 해시 코드
equals() 메서드가 true를 반환하는 두 객체는 반드시 동일한 해시 코드를 가져야 한다.

 

3. hashCode() 반환 값 중복 피하기
서로 다른 객체에 대해 같은 해시 코드를 반환하면 성능 저하가 발생할 수 있으므로 해시 코드의 충돌을 최소화해야 한다.

 

4. null 처리
equals()에서 null과의 비교는 false를 반환해야 하며,

hashCode()에서 null 객체에 대한 해시 코드를 반환하는 것은 허용되지 않으므로

equals() 및 hashCode() 구현에서 null에 대한 적절한 처리를 해야 한다.

 

5. 불변성 유지
hashCode() 및 equals()가 사용하는 필드가 변경되지 않도록 불변성을 유지해야 한다.

객체의 내용이 변경되면 hashCode()와 equals()의 결과가 예측할 수 없게 되므로 주의가 필요하다.

 

6. equals() 메서드의 구현 확인
equals()를 구현할 때 객체의 타입 체크와 null 체크를 올바르게 수행해야 한다.

그리고 상위 클래스에서 이미 구현된 equals()를 호출하는 방법도 고려해야 한다.

 

7. hashCode()의 일반 규약 따르기
hashCode() 메서드는 equals() 메서드가 true를 반환하는 두 객체에 대해서 동일한 값을 반환해야 한다.

그리고 equals()가 false를 반환하는 경우에는 필요에 따라 다른 해시 코드를 반환해야 한다.