지난 아이템에 이어서 hascode관련 주제이다.

equals를 재정의한 클래스 모두에서 hashcode 또한 재정의 해야하는데,

논리적으로 같은 객체는 같은 해시코드를 반환해야 한다.

 

 

(equal()의 결과가 true면 해시코드도 같아야 함)

hashcode()는 객체의 해시코드(hash code)를 반환하는 메소드이다.

 

equals()와 hashCode() 모두 객체의 주소를 이용하는 메소드이기 때문에

수정시에 같이 재정의해주지 않으면 같은 값 객체라도해시값이 다르게 나올 수 있는 문제가 생긴다.

 

일반적인 클래스에서 equals와 hashcode를 override하면 다음 처럼 나온다.

import java.util.Objects;

class Test {
    private String name;
    private int age;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Test test = (Test) o;
        return age == test.age && Objects.equals(name, test.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

자동 생성시에 equals랑 hashcode를 함께 구현하게끔 나오는 것 보면

그만큼 두가지 메소드를 함께 생성하는게 중요하다는 것을 알 수 있다.

 

재정의 하는 경우가 얼마나 많을지 모르겠지만 두가지 중 하나의 메소드를 수정할 상황이 생기면

지금 주제를 잘 떠올려야할것이다.

+ Recent posts