equals() 메소드는 Object 클래스에 정의되어 있습니다.
Object class 내부의 equals()를 살펴보게 되면
public boolean equals(Object obj) {
return (this == obj);
}
위와 같이 매우 단순하게 구성 되어 있는 것을 알 수 있습니다.
즉, Object에 기본적으로 정의 되어 있는 equals() 메소드는 Object가 물리적으로 동일한지 여부를 체크한다는 것을 알 수 있습니다.
따라서, 두 객체가 논리적으로 같은지는 단순하게 Object에 정의되어 있는 equals() 메소드를 사용해서는 판단 할 수 없습니다. 따라서, 반드시 equals()를 적절하게 재정의 해야만 하는 것이죠.
물리적으로 같은 객체와 논리적으로 같은 객체를 이해 하지 못하는 분들이 있을 것 같아 첨언을 하자면,
아래의 예시에서 A와 B는 논리적으로는 같은 객체이지만, 물리적으로는 다른 객체라고 볼 수 있습니다.
A와 B 레퍼런스 변수가 가리키는 실제 객체는 다르지만, 우리는 두 객체를 사실상 같은 객체로 취급하고 싶기 때문입니다.
Money A = new Money("1000"); // 1000원
Money B = new Money("1000"); // 1000원
equals()를 올바르게 재정의 하기 위해서 만족시켜야 할 조건들이 있는데요 그러한 조건들은 Java SE 공식 문서에서 확인 하실 수 있습니다. 이 글에서는
equals()를 재정의 할 때에는 몇가지 조건들을 만족시켜야 한다.
내가 재정의한 eqauls()가 올바른지 확인하기 위해서는 그러한 조건을 모두 만족시켜야 한다.
위의 2가지 사실을 기억해야 한다는 것만 말씀드리고 자세한 내용들은 공식문서를 읽어보시기 바랍니다.
이렇게 말씀 드리는 이유는,
제가 생각하기에는 위의 조건들을 생각하면서 equals()를 직접 재정의 하는 것 보다는 라이브러리(lombok)나 IDE의 도움을 받아서 eqauls()를 작성하고
eqauls()를 검증하는 라이브러리(EqualsVerifier)를 통해서 제대로 구현이 되었는지 확인 하는 것이 더 안전하고, 효율 적인 방법인 것 같기 때문입니다.
하지만 equals()를 올바르게 정의했다고 하여도, 주의 해야 할 점이 한가지 있습니다.
바로, equals()를 재정의하고 있는 객체를 상속하여 equals()를 다시 재정의 하는 경우인데요.
이러한 상황을 주의해야 하는 이유는 제가 설명하기 보다는 해당링크의 2.3번 항목을 읽어보시는 것이 더 많은 도움이 될 것 같습니다.
결론부터 말하면, Hash 관련 Collection들을 올바르게 사용하기 위해서입니다.
더 자세한 내용은 이 글에서 확인 하실 수 있습니다.
VO(Value Object)를 사용 할 때에만 위의 2가지 메소드를 모두 VO. 즉, 값을 나타내기 위한 Object에서만 사용 하도록 해야 한다고 합니다. 그렇지 않을 경우에는 문제를 일으킬 가능성이 매우 높다고 합니다.
실무나 프로젝트에서 직접 제가 사용해보지 않고 적은 글이라 짜집기 형식이 많습니다. 밑의 출처에 더 자세한 설명이 많습니다. 이 링크를 발판 삼아서 아래의 링크들을 하나씩 읽어보시는 것도 좋은 방법일 것 같습니다.
자세한 설명 감사합니다! 더 많이 알아갑니다ㅎㅎ