오늘 진행된 세션의 주제는 동등성과 동일성에 대한 내용이었다.
동등성, 동일성이라는 개념 이름(?)은 생소했는데 세션을 들으니 객체 비교와 관련된 나도 조금 아는 개념이었다.
자바에서 보통 비교를 할 때 숫자는 == 을 사용하고, 문자열 비교는 equals 사용했는데 이것이 동등성과 동일성 개념인 것..!
문자열 비교는 == 을 사용하면 주소값을 가져오므로 equals를 사용한다. 까지만 알고 자세히는 몰랐다. 하지만 이번 세션을 들으며 동등성과 동일성에 대해 배우고, equals()와 hashCode()의 연관성을 알게되었다. 👍🏼
2024.11.22 - [JAVA] - 동등성과 동일성
인텔리제이가 너무 고맙게 equals() 메서드 오버라이딩을 알아서 해주는 기능을 만들어줬다!!
근데 같이 따라오는 hashCode()는 뭘까?
🤔 hashCode() 란
- 객체의 해시 값을 반환하는 메서드
- 객체를 식별하기 위한 정수 값을 생성하여, 객체가 저장될 버킷을 결정
- 해시기반 컬렉션 (HashMap, HashSet 등)에서 객체를 빠르게 검색하고 비교하는 데 사용된다.
🤔 equals()와 HashCode()의 연관성
- equals()로 두 객체를 비교했을 때 true라고 판단되면, hashCode() 값도 반드시 같아야 한다. (규칙)
- 두 객체의 hashCode() 값이 같아도 equals()가 항상 true가 되는 것은 아니다.
- 해시기반 컬렉션에서의 객체 비교와 검색
: hashCode()값이 동일한 두 객체에 대해, 실제로 객체가 동일한지 equals()를 통해 논리적으로 비교
equals() | hashCode() | 컬렉션 (HashMap, HashSet ..) |
true | true | 같은 key |
true | false | 다른 key |
false | true | 다른 key |
🤔 equals()와 HashCode()를 같이 재정의 = 오버라이딩 해야 하는 이유
equals()는 재정의하고, hashCode()는 재정의하지 않으면
HashSet이나 HashMap과 같이 해시코드를 기반으로 동작하는 구조에서 올바르지 않게 동작할 수 있기 때문에 같이 재정의해야 한다.
예를 들어, equals()는 재정의를 통해 서로 true 반환하였지만, hashCode()는 서로 다른 값을 반환하는 경우가 발생할 수 있다.
따라서 equals()를 재정의했다면 hashCode()도 재정의해주는 것이 좋다.
'TIL' 카테고리의 다른 글
Java 키오스크 과제 - 챌린지 Lv1 트러블 슈팅 (1) | 2024.11.28 |
---|---|
17일차) 알고리즘, 키오스크 과제 리팩토링 (0) | 2024.11.27 |
Java 계산기 과제 - level 2 트러블슈팅 (0) | 2024.11.20 |
JAVA 계산기 과제 - level 1 트러블슈팅 (0) | 2024.11.20 |
10일차) (1) | 2024.11.15 |
댓글