본문 바로가기

언어/자바

[Effective java] equals는 일반 규약을 지켜 재정의하라.

1. 반사성: x.equals(x)는 true

2. 대칭성: x.equals(y) 의 결과는 y.equals(x)와 같아야한다.

3. 추이성: x.equals(y)가 true이고 y.equals(z)가 true이면 x.equals(z)도 true

4. 일관성: 한번 true면 계속 true여야한다.

5. null이 아님: null이 아닌 x에 대해 x.equals(null)은 false여야한다.

 

* 클래스를 상속받아 확장하면서 value를 추가하면 equals를 재정의하면서 일반규약을 지킬 순 없다.

: 다시 말해 구체 클래스를 확장해 새로운 값을 추가하면서 equals규약을 지킬 수 있는 방법은 없다.

(instanceOf 대신 getClass로 비교해도 되지만 이는 리스코프 원칙을 위반한다)

 

올바른 equals 구현 가이드라인

1. == 비교

2. instanceOf 비교

3. 올바른 타입으로 형변환

4. 필드 비교

 

주의 사항

1. equals를 재정의 하면 반드시 hashCode도 재정의하라

2. 너무 복잡하게 하지 말라

3. 매개변수는 반드시 Object 형이어야한다.