본문 바로가기
Java/Basic

equals() & hashCode()

by TheUphill 2020. 3. 24.
- hashCode()
  • 목적은 객체들을 식별하기 위한 값. 단 서로 다른 객체라도 동일한 hashCode()를 가질 수 있다(HashCode Collisions)
  • Java애플리케이션을 실행하는 동안 동일한 개체에 대해 호출될 때마다 해시 코드 메서드는 개체에 대한 동등한 비교(equals)에 사용되는 정보가 수정되지 않는 한 동일한 정수를 일관되게 반환해야 한다.
  • Default는 Object 클래스의 구현체로써 객체의 내부 메모리 주소를 숫자로 변환한 값을 기반으로 한다)
 
- equals()
  • 객체의 동등성을 비교하는데 사용.
 
- equals() 와 hashCode()의 관계
  • 만약 두 객체가 equals()를 통한 동등한 객체인 경우, hashCode() 함수 호출 결과는 반드시 동일한 정수를 반환해야한다.
  • 만약 두 객체가 equals()를 통한 동등한 객체가 아니더라도, hashCode()의 반환 결과가 같을 수도 있다.
  • 둘중 하나를 override 했다면 나머지 함수도 반드시 override해야 하며 두 함수의 연산에 사용되는 변수는 동일해야 한다. 그렇지 않을 경우 논리적으로 동일한 객체(equals를 통해)를 HashSet에 등록할 때 새로운 기존 데이터가 갱신되는게 아닌 매번 새로운 데이터가 등록될 수 있다.
 
- HashCode는 바뀔 수 있다.
일반적으로 대부분의 클래스 라이브러리는 항상 일관된 HashCode를 반환환다. 종종 동일한 프로그램일 실행한 다른 프로세스에서 논리적으로 동일한 객체에 대해 다른 HashCode를 반환할 수 있다(프로토콜 버퍼 사례가 있음) 때문에 분산 시스템에서 객체를 식별하기 위한 값으로 hashCode를 사용하는걸 지양해야 한다.
 

댓글