윤개발
[ITEM10] equals는 일반 규약을 지켜 재정의하라. 본문
재정의를 하지 않는다.
equals
메서드는 재정의하기 쉬워보이지만 곳곳에 함정이 있어 큰 문제가 될 수 있다.
가장 쉬운 길은 아예 재정의를 하지 않는 것이다. 아래 상황에 해당한다면 재정의 하지 않는것이 최선이다.
- 각 인스턴스가 본질적으로 고유하다. 값을 표현하는게 아니라 개체를 표현하는 클래스가 해당된다.
- 인스턴스의 논리적 동치성을 검사할 일이 없다.
- 상위 클래스에서 재정의한
equals
가 하위 클래스에도 딱 들어맞는다. - 클래스가
private
여서equals
를 호출할 일이 없다.
실수로라도 호출되는 걸 막고싶다면 예외처리로 throw new AssertionError()
를 발생시키자..
재정의 하는 상황
- 논리적 동치성을 비교해야할 때 재정의하면 좋다. 객체가 아니라 값이 같은지를 알고싶을때
- Map의 키, Set의 원소 등으로 사용할 때
재정의 할 때는 다음 일반 규약을 따라야 한다.
- 반사성 : 객체 X에 대하여
x.equals(x)
는 true 여야한다. - 대칭성 : 객체 X,y에 대하여
x.equals(y)
가 true이면y.equals(x)
도 true 여야한다. - 추이성 : 객체 x,y,z에 대하여 x=y , y=z 이면 x=z도 true 여야한다.
- 일관성 : null이 아닌 참조 값x,y에 대하여
x.equals(y)
는 항상 true거나 false여야한다. - null-아님 : null이 아닌 x에 대하여
x.equals(null)
은 false 이다.
좋은 equals를 구현하는 법
- == 연산자를 사용해 자기 자신의 참조인지 확인하라.
- instanceof 연산자로 입력이 올바른 타입인지 확인하라. null검사도 해준다.
- 입력을 올바른 타입으로 형변환하라.
- 입력 객체와 자기 자신의 대응되는 핵심 필드들이 모두 일치하는지 하나씩 검사하라.
- 성능을 위해 다를 가능성이 더 크거나, 비용이 싼 필드를 먼저 비교해라.
정리
equals 메소드를 재정의하지 말자. 꼭 필요하다면 5가지 규약을 반드시 지켜야한다.
'책 내용 요약 > Effective Java 3판' 카테고리의 다른 글
[ITEM23] 태그 달린 클래스보다는 클래스 계층구조를 활용하라. (0) | 2020.04.14 |
---|---|
[ITEM16] public 클래스에서는 public 필드가 아닌 접근자 메서드(getter)를 사용하라. (0) | 2020.04.14 |
[ITEM9] try-finally보다는 try-with-resources를 사용하라. (0) | 2020.04.14 |
[ITEM8] finalizer와 cleaner 사용을 피하라 (0) | 2020.04.14 |
[ITEM7] 다쓴 객체 참조를 해제하라. (0) | 2020.04.14 |
Comments