7fed8274b58b6af223ed85e74e847170515d97d1d7235f089b2c9552e4a39f849d05

참조타입 객체의 최상위 클래스가 인건 알것임

이 클래스에서 제공하는 equals hash 메서드에 대해 얘기해볼까함


오브젝트.equals 는 identity 동일성 주소비교임

예를들어

Car c1 = new Car("현대기아");
Car c2 = new Car("현대기아");

c1.equals(c2) 비교하면 false 나옴

위 객체 생성 시 참조타입이므로 힙메모리에 각각 다른 주소로 생성됨


그럼 어떻게 값비교 (equality)를 할 수 있냐?

equals를 오버라이딩하면 됨


다음은 hash 메서드

해쉬 기반의 컬렉션을 사용할때 문제를 일으킴

이런 컬렉션은 내부적으로 버킷을 가지고 어디에 저장할지 해쉬코드보고 정함

최상위 해시코드 메서드는 객체 힙메모리 주소보고 판단하기 때문에

이걸 그대로 컬렉션에서 lookup할 시 버그 발생함

예를들어

Set<Car> hs = new HashSet<>() 후

hs.add(c1)

hs.contains(c2) 하면 false 나옴

다른 힙 주소 다른 해쉬코드 이기이기 때문에 버그발생함


니가 만약 equals만 오버라이딩하고 hash를 하지 않으면

내부적으로 값은 동등한데 주소가 다르므로 해쉬충돌이 일어남

그러면 체이닝이든 방법을 써서 충돌을 피하고 위와 똑같은 결과가 나옴(lookup 이 안된다는 얘기임)

그래서 equals와 hashCode 오버라이딩은 매우 중요함


오버라이딩은 lombok쓰던가 ide에서 제공하늨거 쓰면됨

이상임.