본문 바로가기

Java

equals, hashCode

반응형

java 에서 동등 비교를 할때 == 이나 equals 를 사용합니다.

override 하지 않고 사용한 equals 는 ==과 동일한 역할을 수행합니다.

즉, 주소값을 비교하게 됩니다. 이는 Object 클래스의 equals를 보시면 알 수 있습니다.

따라서 객체의 내용이 같은지 비교하기 위해선 equals를 override하여 재정의해줍니다.

 

equals를 사용하려면 반드시 hashCode()를 함께 Override하여야 합니다.

equals만 사용해서 두객체를 같다고 정의해두어도 Collection 계열의 객체에선 같다고 판단하지 않기 때문입니다.

HashSet, HashMap과 같은 Collection 계열에서는 hash를 사용하여 동등비교를 수행합니다.

 

equals 와 hashCode를 사용할 때 유의하여야 할 점은 아래와 같습니다.

  • 1. equals 값이 동일하다면 hashCode의 값은 반드시 동일해야 한다
  • 2. hashCode 가 같은 값이더라도 equals는 동일하지 않을 수 있다.
  • 3. 둘을 연산할때 동일한 parameter를 사용해서 연산해야한다.

1,2 번은 그럭저럭 이해가 갔는데 3번은 무슨의미일까요?

예를 들어 Class Locaition에 멤버변수 first_x, first_y, second_x, second_y가 있다고 합시다.

이 클래스에 대한 equals 함수는 아래와 같이 정의했습니다.

equals 를 사용할때에는 instanceof 를 사용해 같은 타입인지 검사해야합니다

4개의 멤버변수를 모두 사용해서 비교하고 있습니다.

이럴경우, hashCode에서도 4가지를 모두 사용해서 만들어야 부작용을 줄일 수 있습니다.

 

이때 왜 31이라는 소수를 사용하여 hashcode를 만드는 것일까요?

소수이면서 홀수이기 때문에 hash하였을 때 충돌이 가장 적은 숫자이기 때문입니다.

위와 같은 방식으로 사용하게 되면 31진법으로 표현한 것입니다.

반응형

'Java' 카테고리의 다른 글

Java8  (0) 2021.02.13
Refresh Token  (0) 2020.12.15
Thread Safe  (0) 2020.09.22
컴파일 과정  (0) 2020.09.18
HashMap & HashSet  (0) 2020.09.16