[Java]equals()와 hashCode()

무지성개발자·2023년 7월 15일

equals()와 hashCode()는 뭘까?

equals()

두 객체가 동등한지 검사하는 메서드로 객체의 내용을 비교한다.

hashCode()

객체를 식별할 수 있는 정수값으로 객체의 해시코드를 반환한다. 주로 해시 기반의 데이터 구조에서 사용한다.


핸드폰으로 보는 equals()

스폰지밥과 뚱이는 오늘 아이폰 14를 구매했다.
이제 사람들은 스폰지밥과 뚱이가 똑같은 핸드폰을 쓴다고 할 것 이다.
근데 이상하다? 둘은 하나의 핸드폰을 공유(동일성)해서 쓰는게 아니라 같은 기종의 폰을 각자 쓰고 있는데(동등성) 같은 핸드폰을 쓴다고 한다.

이게 바로 equals()이다. 객체가 동일한지 비교하는게 아니라 동등한지 비교를 한다는 것이다.

동일성? 동등성? 그게 뭔데 씹덕아.. 라고 생각하다면 여기 좀 갔다오자.


핸드폰으로 보는 hashCode()

핸드폰 대리점에서는 핸드폰 관리를 위의 표 처럼 할 것이다.
대리점은 오늘 아이폰14 2대를 팔았다고 하지만 code번호 11214를 2대 팔았다고 할 수 있다.
여기서 code를 hashCode()라고 볼 수 있고, equals()로 동등한 객체로 판단 된 객체는 같은 hashCode를 가지고 있다는걸 알 수 있다.


코드로 보는 equals()와 hashCode()

이상하다 위의 예시대로 한거 같은데 equals() 비교한 스폰지밥의 폰과 뚱이의 폰이 false로 나오고 둘의 hashCode도 다르다.


equals()와 hashCode()는 오버라이딩을 해줘야한다!

Object에서 상속 받는 equals()와 hashCode()는 오버라이딩이 필요하다.

본문 처음 문장을 보면 equals()는 객체의 내용을 비교한다고 했다. 그렇다면 어떤 내용을 어떻게 비교 할건지 재정의 해줘야 한다는 것이다.

String, Integer 클래스도 한번 까보면 equals()와 hashCode() 오버라이드 해서 사용하고 있다.

equals()를 오버라이딩 하니 스폰지밥의 폰과 뚱이 폰이 드디어 같다고 나온다. 하지만 여전히 두 폰의 hashCode는 다르다 이러면 hashCode를 기준으로 자료를 저장하는 자료구조에서 문제가 발생한다.

위 코드의 HashSet을 보면 hashCode가 달라서 중복처리가 안돼서 size가 2개로 나온다. 이게 equlas()로 동등한 객체가 같은 hashCode를 가져야 하는 이유이다.

hashCode()도 오버라이딩 해주니 스폰지밥의 폰과 뚱이의 폰의 hashCode도 같아지고 HashSet의 size도 1개가 되었다! (내 hashCode()는 대충 짜서 다른 폰이 들어와도 같은 코드를 내뱉을 가능성이 높다. 이런걸 해시충돌이라고 하니 사용할 때는 최대한 고유의 해시값을 가질 수 있도록 하는게 좋다!)


한줄 평 : equals()와 hashCode()는 꼭 같이 오버라이딩하자!

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글