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를 반환하는 경우에는 필요에 따라 다른 해시 코드를 반환해야 한다.
'BACKEND > JAVA' 카테고리의 다른 글
자바 Enum의 특징과 사용법, 그리고 주의 사항을 알아보자 (0) | 2023.12.29 |
---|---|
자바의 원시 타입(Primitive Type) VS 참조 타입 (Reference Type) (0) | 2023.12.18 |
오버로딩과 오버라이딩의 개념 및 차이점 (0) | 2023.12.13 |