결론: 꼭 필요한 경우가 아니면 equals를 재정의하지 말자. 재정의 할 때는 5가지 규약을 지키며 비교한다.
IDE, Google AutoValue로 도움 받는걸 추천함.
- 객체 식별성이 아니라, 논리적 동치성(값 비교)을 확인해야 하는데, 상위 클래스의 equals가 논리적 동치성을 비교하도록 재정의 되지 않았을 때
- reflexivity: x.equals(x) -> true
- symmetry: x.equals(y) 가 true이면 -> y.equals(x)
- transitivity: x.equals(y) , y.equals(z) -> z.equals(x)
- consistency: x.equals(y) 반복해서 호출하면 항상 true 이거나 항상 false를 반환
- not-null: x.euqals(null) -> false
- == 연산자 사용해 입력이 자기 자신의 참조 인지 확인
- instanceof 연산자로 입력이 올바른 타입인지 확인 (null 검사 굳이 하지 않아도 됨)
- 입력을 올바른 타입으로 형변환
- 입력 객체와 자기 자신의 대응되는 '핵심' 필드들이 모두 일치하는지 하나씩 검사
- 그럼에도 불구하고, 특별하게 equals()가 중요하게 여겨지는 비즈니스 로직을 직접 경험하지 못해서 와닿지는 않음. 큰 문제가 직접 발생하면 식겁할 듯