Equals, hashcode Overide (List To Set이 안될때)
역시 이론적인걸 알고있어도 왜 필요한지 명확히 깨닫지 않았으면 필요없는 지식인것같다..
쿼리를 수행하며 조건에 맞는 EventList들을 반환하는 서비스가 있었다.
한번의 쿼리로 수행하기 어려운 조건들이라 두번의 쿼리를 수행했고, 그 도중에 중복되는 event가 존재했다.
그래서 그러한 List를 Set으로 변경하면서 중복을 제거하려고하니..
List<-> Set 변경 방법 : https://hianna.tistory.com/555
[Java] List를 Set으로, Set을 List로 변환하기
List를 Set으로, Set을 List로 변환하는 방법을 정리하였습니다. List를 Set으로 생성자(Constructor) Set.copyOf() - (Java 10 이후, unmodifiable) Set을 List로 생성자(Constructor) List.copyOf() - (Java 10 이후, unmodifiable) 1. L
hianna.tistory.com
오잉? 제거가 되지 않았다!!
바로 디버깅을 해보니, 객체 번호가 달랐다. 왜지? 안에 들어있는 값은 같았는데 객체가 다르다니.. 버근가? 역시 인텔리제이야..!!
그러고서야 깨달았다.
한번씩 어디선가 들었던 equals와 hashcode를 오버라이딩해줘야 같은 값일 때 같은 객체로 취급한다는걸..
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof EventSimpleDto))
return false;
EventSimpleDto event = (EventSimpleDto)o;
return id == event.id && Objects.equals(id, event.id);
}
// hashcode 재정의
@Override
public int hashCode() {
return Objects.hash(id);
}
- 현재는 id만 같으면 같은 객체라는게 확실한 상황이기에 이렇게 수행하지만, 다른 경우가 많으니 조심하자! -
intellij 단축키 (window 기준 : alt + insert) 로 오버라이딩이 가능하다.
이 코드를 보더니 한 선배는
Objects.hash도 해시해!! 라는 말을 줘서, ( ???? ) 하는 상태였다.
위 코드는 코틀린이지만.. 아무튼 저런식으로 해시코드를 작성하는 방법이 있다고 한당.. 추후에 하기 ㅎㅎ
아무튼 , 같은 모양인 객체를 같은 객체로 취급하고싶다면,
equals와 hashcode를 모두!! 재정의 해주어야한다. 그 이유에 대해선 아래 를 참고하자
[JAVA] ☕ equals / hashCode 오버라이딩 - 완벽 이해하기
equals 메소드 어떤 두 참조 변수의 값이 같은지 다른지 동등 여부를 비교해야 할때 사용하는 것이 equals() 메서드이다. 대표적으로 String 타입의 변수를 비교할때 가장 많이 거론되는 메서드일 것
inpa.tistory.com