Java에서 최상위 class인 Object의 final이 아닌 methode들 (equals, hashCode, toString ,clone, finalize)는 모두 overriding을 염두에 두고 설계된 것이라, overriding시 지켜야 하는 일반 규약이 명확하다.
1
publicbooleanequals(Object obj);
이 중에서 equals method는 == 연산자와 마찬가지로 참조변수의 참조값을 비교하도록 정의되어 있는데, 다음과 같은 상황에서는 overriding 하지 않는 것이 좋다.
1 2 3 4 5 6 7
1. 각 인스턴스가 고유한 경우 ex) Thread와 같이 객체가 값을 표현하는 목적이 아닌 경우
2. 인스턴스가 논리적으로 동일한지 검사할 일이 없는 경우
3. 상위 class에서 재정의한 equals가 하위 클래스에도 적합한 경우
4. 클래스가 private 이거나, package-private이고, equals method가 호출될 일이 없는 경우
equals는 언제 overriding해야하는가?
두 객체가 참조값이 동일한지(물리적으로 동일한 주소값을 같는지) 가 아니라, 두 객체가 논리적으로 동일한지 값을 비교하고자 할떄 사용한다.
인스턴스가 둘 이상 만들어지는 값 클래스
equals method overriding시 규약
1 2 3 4 5 6 7 8 9 10 11
1. 반사성 (reflexivity) : null이 아닌 모든 참조값 x에 대해 x.equal(x) == true
2. 대칭성 (symmetry) : null이 아닌 모든 참조값 x,y에 대해 y.equals(x) == true -> x.equals(y) == true
3. 추이성 (transitivity) : null이 아닌 모든 참조값 x,y,z에 대해 x.equals(y) == true , y.equals(z) == true -> x.equals(z) == true
4. 일관성 (consistency) : null이 아닌 모든 참조값 x,y에 대해 x.equals(y) 를 반복해서 호출하면 항상 true or false