참조타입 객체의 최상위 클래스가 인건 알것임
이 클래스에서 제공하는 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에서 제공하늨거 쓰면됨
이상임.
해당 댓글은 삭제되었습니다.
jpa의 경우 테스트코드나 로직에서 쓰이지 repository에서 반환하는 엔티티가 같은지 아닌지
연산자 오버라이딩 안되는 언어^^
자바공부하지마
Equals는 간단 cmp로 비교하는것이지 오버라이딩해서 비교하는것은 아님 오버라이딩은 replacing origin with new data 임 ㅇㅇ
어떻게 오버라이딩해야하나요?? - dc App