본문 바로가기
TIL

14일차) 자바 동등성과 동일성 , equals()와 hashCode()

by suyeoneee 2024. 11. 22.

오늘 진행된 세션의 주제는 동등성과 동일성에 대한 내용이었다.

동등성, 동일성이라는 개념 이름(?)은 생소했는데 세션을 들으니 객체 비교와 관련된 나도 조금 아는 개념이었다.

자바에서 보통 비교를 할 때 숫자는 == 을 사용하고, 문자열 비교는 equals 사용했는데 이것이 동등성과 동일성 개념인 것..!

문자열 비교는 == 을 사용하면 주소값을 가져오므로 equals를 사용한다. 까지만 알고 자세히는 몰랐다. 하지만 이번 세션을 들으며 동등성과 동일성에 대해 배우고, equals()와 hashCode()의 연관성을 알게되었다. 👍🏼

 

2024.11.22 - [JAVA] - 동등성과 동일성

 

동등성과 동일성

❓ a와 b를 == 으로 비교하는 것과 같이 Book 두 가지 객체를 == 으로 비교하면 false가 나온다. 왜일까??  💾  메모리 구조int a, b, c는 메모리 구조 중에서 메서드 영역에 저장된다.Book 객체는 메모

mon-monde.tistory.com

 

인텔리제이가 너무 고맙게 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()도 재정의해주는 것이 좋다. 

 

댓글