equals 와 hashCode

Woozy9ucci·2023년 12월 6일
0

KOTLIN

목록 보기
3/4

equals 와 hashCode

equals()는 객체를 비교하기 위해 사용한다.
Object(Any?).equals 를 오버라이드 하기 전과 후를 비교해보자
->T의 인스턴스 t와 t2의 동등성을 비교해보자
이 둘은 동일한 프로퍼티를(동등성) 가지고 있지만
equals가 false를 return하고 있다.
-> equals()를 override 하니 아래 equals()의 결과가 true로 바뀌었다.
하지만 JVM 언어에서는 hashCode가 지켜야 하는 "equals가 true를 반환하는 두 객체는 반드시 같은 hashCode를 반환해야 한다"라는 제약(하단 참조)이 있는데, T Class는 이를 어기고 있다.
따라서 equals를 오버라이드 했으므로 hashCode도 오버라이드 해야한다.
이로써 인스턴스의 주소값이 아닌 필드들로 동등함을 판단할 수 있게 되었다.
이제는 어떻게 동일성을 비교할까?
===연산자를 이용해서 동일성을 비교할 수 있다.
즉 == 연산자는 equals와 같고 ===은 참조 주소를 비교하는 연산자이다.

(해시코드는 규약에 의해 설정하는 것이지 비교에는 전혀 사용되지 않는다.
또한 해시코드는 주소값을 Int로 해싱하여 리턴하는데 그렇다고해서 HashCode가 Unique하지는 않다. (해시 충돌 등이 일어날 수 있기 때문에) 따라서 HashCode를 key로 사용하는 것은
지양 해야 할 것 같다.)

======================================================

  • 해시코드 규약
    • equals 비교에 사용되는 정보가 변경되지 않았다면, 애플리케이션이 실행되는 동안 그 객체의 hashCode 메소드는 몇 번을 호출해도 일관되게 항상 같은 값을 반환해야 한다.(단, 애플리케이션을 다시 실행한다면 이 값이 달라져도 상관없다.)
    • equals(Object)가 두 객체를 같다고 판단했다면, 두 객체의 hashCode는 똑같은 값을 반환해야 한다.
    • equals(Object)가 두 객체를 다르다고 판단했더라도, 두 객체의 hashCode가 서로 다른 값을 반환할 필요는 없다. 단, 다른 객체에 대해서는 다른 값을 반환해야 해시테이블의 성능이 좋아진다.
  • Object.equals()
    • 두 개체가 모두 null 을 가리키면 equals()는 true 를 반환한다.
    • 개체 중 하나가 null 을 가리키면 equals()는 false 를 반환한다.
    • 두 개체가 모두 같으면 equals()는 true를 반환한다.
    • 그렇지 않으면, 등식 방법을 사용하여 등식을 결정한다.
      @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            TestEquals that = (TestEquals) o;
            return b == that.b && Objects.equals(a, that.a) && Objects.equals(list, that.list);
        }

!느낀점 : Collection의 containsKey등은 equals로 비교하기 때문에 상황에 맞게 equals를 Override하여 사용하면 될 것 같다.

0개의 댓글