1 계기
SpringBoot에서 lombok의 @Data 어노테이션이 붙어있으면 equals로 오버라이드 하지 않아도 객체가 논리적으로 동일한지 비교해준다. 근데 @Data에 보면 EqualsAndHashCode가 붙어 있다. equals는 아는데 hashCode는 뭔지 궁금해서 찾아보게 되었다.
2 자바에서 객체 동등성 비교
자바에서 객체의 동등성을 비교할 때는 일반적으로 equals() 메서드를 활용한다.
equals는 Object 클래스에 정의되어 있는 메서드로, 따로 오버라이드 하지 않으면 '=='연산자와 동일하게 객체의 메모리 주소값을 비교한다.
3 equals와 hashCode
3.1 equals
equals는 따로 override하지 않으면 객체의 메모리 주소를 비교한다.
이는 Object 클래스에 정의되어 있고, 모든 클래스는 Object 클래스의 자식이기 때문에 equals함수를 호출할 수 있다.
override를 통해 이를 수정할 수 있다.
3.2 hashCode
객체에 대해 정수형 값을 반환하는 함수이다. hashCode는 정수이다.
해시 기반 컬렉션에서 객체에 대해 저장하거나 검색할 때 사용한다. 같은 hashCode를 가지는 객체는 해시 기반 컬렉션에서 같은 버킷에 저장된다.
3.3 equals와 hashCode의 관계
equals가 true인 두 객체는 반드시 같은 hashCode 값을 가져야한다. 하지만 같은 hashCode를 가져도, equals는 false일 수 있다.
Hash 기반 컬렉션**(HashSet, HashMap, LinkedHashMap, LinkedHashSet 등)에서는 주로 hashCode 함수를 이용해서 동등성을 체크한다.
또한 비 해시 기반 컬렉션에서는 주로 equals 함수를 이용해서 동등성을 체크한다.
이는 해시 기반 컬렉션의 성능과 정확도를 위해 중요하다. 예를 들어, HashMap에서 키-값을 저장할 때, 먼저 객체의 hashCode를 이용해 저장할 위치(버킷)를 찾고, 그 후에 equals 메서드로 객체가 논리적으로 같은지를 확인합니다.
equals와 hashCode가 일관성 있게 오버라이드되지 않으면, 같은 객체임에도 불구하고 서로 다른 버킷에 저장되어 잘못된 동작이 발생할 수 있습니다. 따라서 equals와 hashCode는 반드시 같이 override되어야 한다.
4 결론
equals 함수와 hashCode 함수는 3.3에서 말한 관계를 가지도록 반드시 동시에 override되어야 한다.
※ contains 메서드 ※
contains() 메서드에서 동등성을 비교할 때는 equals()를 사용한다. 그래서 equals() 오버라이드하면 자동으로 논리적으로 동일한 객체가 있는지 찾아준다.
또한 해시 기반 컬렉션에서는 hashCode()를 이용해서 먼저 버킷을 찾고, equals()로 동등성을 체크한다.
'스터디 > Java' 카테고리의 다른 글
[Java 자바] '...' 가변인자(Varargs) (1) | 2024.11.21 |
---|---|
[Java 자바] 체크 예외와 언체크 예외(Checked Exception, Unchecked Exception) (0) | 2024.11.14 |
[Java 자바] finally는 반드시 실행된다. (0) | 2024.11.10 |
[Java 자바] 정적 초기화 블록, 인스턴스 초기화 블록 (0) | 2024.09.20 |
[Java 자바] 제네릭(generic)이란? (0) | 2024.03.19 |