이번 챕터의 목적


모든 객체의 조상 객체는 Object클래스다.

이 Object에서 final이 아닌 메서드(equals, hashCode, toString, clone, finalize)는 오버라이딩을 염두해두고 설계된 메서드들로, 재정의를 일반 규약에 맞지 않게 구현하면 의도와 다르게 동작할 수 있다.

이번 챕터에서는 이런 메서드들을 언제 어떻게 재정의해야하는지를 다룬다.

10. equals는 일반 규약을 지켜 재정의하라


두 객체가 같은지 비교하는 목적으로 사용되는 equals 메서드는 언뜻 보면 재정의하기도 쉬워보인다. 하지만, 몇가지 규약들을 제대로 지키지 않을경우 의도와 다르게 동작을해서 프로그램에 오류를 발생시킬 수 있다.

그렇기에 가장 쉬운 해결책은 재정의를 하지 않고 Object에 정의된 equals 로직을 그대로 사용하는 것이다.

재정의를 하지 않게 될 경우 해당 클래스의 인스턴스는 자기자신과만 같다고 평가하게 된다.

두 개의 Person 객체 인스턴스

두 개의 Person 객체 인스턴스

위 두 개의 객체 인스턴스를 살펴보면 둘 다 내용(name, age)은 catsbi/34로 동일하다. 하지만, 재정의하지 않은 Object의 equals을 사용하면 둘은 다른 객체로 평가된다. 즉, 동등성은 성립하지만 동일성은 성립하지 않기 때문인데, 그래서 equals를 재정의해야 하는 경우들이 있는다.

재정의 하지 않아도 되는 경우