Object의 equals()와 hashCode()

bagt13·2022년 11월 30일
0

JAVA

목록 보기
7/7

equals()

기본적으로 값의 동일성이 아닌 객체의 동일성을 비교하고 있다.

public boolean equalst(Object obj){
	return (this == obj);
}

따라서 값을 비교하고 싶다면 equals() 메서드를 override 해야 한다.

String의 경우 equals() 메서드를 override 하고 있기 때문에 값을 비교할 수 있는 것이다.




hashCode()

runtime 객체의 유일한 integer 값을 반환한다. Object 클래스에서는 기본적으로 객체의 주소값을 정수로 변환한 값이다.

동일한 객체란 동일한 메모리 주소를 갖는다는 것을 의미하므로, 동일한 객체는 동일한 hashcode를 가져야 한다. 따라서 만일 equals() 메소드를 override 한다면, hashCode() 메소드도 함께 override 해야 한다.



또한 HashTable이나 HashSet, HashMap과 같은 자료구조는 자료를 저장하기 위한 위치를 선택하기 위해 hashCode를 이용한다.

hash 값을 사용하는 Collection (HashMap, HashSet, HashTable)은 객체가 논리적으로 같은지 비교할 때 다음의 과정을 거친다.

  1. 데이터 추가
  2. 데이터의 hashCode() 값을 컬렉션에 가지고 있는지 비교
  3. hashCode가 같다면, equals()로 비교
  4. true일 경우 논리적으로 같은 객체로 판단

따라서 컬렉션에 데이터를 추가하는 경우 equals() 만을 재정의 한다면, hashCode()값은 다를 것이기 때문에 equals() 비교로 넘어가지 않고, 같은 객체가 다른 hashCode 값을 가진 채 중복 저장될 것이다.



이러한 비교 과정은 hashCode의 중복되는 예외의 경우에 문제가 생기는 것을 방지해주는 역할도 한다. 다른 객체임에도 hashCode가 중복되는 경우, equals() 메서드로 객체가 동등한지 확인하기 때문이다.

이는 hashCode() 만으로 객체가 동등한 지 판별하려 할 때 원하는 결과를 얻지 못할 가능성이 있음을 뜻하기도 한다.



참고 자료 : https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B0%9D%EC%B2%B4%EC%9D%98-hashCode%EB%8A%94-%EA%B3%A0%EC%9C%A0%ED%95%98%EC%A7%80-%EC%95%8A%EB%8B%A4-%E2%9D%8C

profile
주니어 백엔드 개발자입니다😄

0개의 댓글