ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 equals()와 hashcode()는 왜 같이 재정의해야하는가?
    Java/자바의정석 2023. 2. 22. 16:10
    반응형

    자바 equals()와 hashcode()는 왜 같이 재정의해야하는가?

    를 알아보기전에 전에 공부했던 내용을 다시한번 확인하고 이유를 파악해보자.

    해시코드란?

    • 객체를 식별할 하나의 정수 값
    • Object는 클래스의 최상위 타입, Object의 hashCode() 메서드는 객체의 메모리 주소를 이용하여 해시 코드를 만들어 리턴하기 때문에 객체마다 다른 값을 가지게 된다.

    equals 메서드란?

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

    해당 코드는 Object.java 에 선언되어있는 equals 메서드이다.

    equals메서드의 기능은 객체의 참조변수를 받아 비교하여 그 결과를 boolean 값으로 알려주는 역할을 한다.

    코드를 보면 단지 참조값을 비교하여 같은지 여부를 판단하여 True, False를 반환한다.

     

     

     

    <출처 https://tecoble.techcourse.co.kr/post/2020-07-29-equals-and-hashCode/>

    위의 그림을 보면 논리적 동등 비교 시 이 hashCode()를 오버 라이딩할 필요가 있는데, HashSet, HashMap, Hashtable은 다음과 같은 방법으로 두 객체가 동등한 지 비교한다.

     

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Person) {
            return id == ((Person) obj).id; //long.id의 주소값과 객체 obj의 주소를 동일할게 한다.
        } else
            return false;
    }

    이코드에서 Person 클래스는 equals 메서드를 재정의하여 필드에있는 id값이 같다면 true를 반환하도록 오버로딩하였다.

    이러한 경우 HashMap을 식별하는 Key로 Key객체를 사용한다면 저장된 값을 찾아오지 못한다.

     

    이유는 HashCode()메서드를 재정하지 않았기 때문이다.

     

    애초에 HashCode()메서드는 객체의 메모리주소를 사용하여 해시코드를 만들기 때문에 다른값으로 인식될수밖에없다.

    아직 HashMap에 대해 공부를 하지않아 자세히는 모르겠지만 일단은 위의 그림대로 hashCode()의 리턴값이 같아야하고 equals()의 리턴값이 같아야 동등객체로 인식한다는 룰이 있다는것만 알아두자.

    반응형

    댓글

Designed by Tistory.