상세 컨텐츠

본문 제목

[이펙티브 자바] Item 10. equals는 일반규약을 지켜 재정의하라 | 3장

Development Study/이펙티브 자바

by yooputer 2023. 4. 26. 11:27

본문

이펙티브 자바 3장 Item10를 요약한 내용입니다.


equals를 override하지 않아도 되는 경우

1. 각 인스턴스가 본질적으로 고유한 경우

2. 논리적 동치성(값이 같은지) 비교할 일이 없는 경우

3. 상위 클래스의 equals를 수정할 필요가 없는 경우

4. 클래스가 privatea나 package-private이고 equals를 수정할 필요가 없는 경우

 

equals를 override할 때 지켜야할 규약

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

2. 대칭성 : x.equals(y)가 true이면 y.equals(x)도 true

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

4. 일관성 : x.equals(y)를 반복했을 때 항상 같은 값

5. null 아님 : x.equals(null)은 false

 

좋은 equals메서드 구현 방법

1. == 연산자로 물리적 동치성 확인

2. instanceof 연산자로 입력타입 확인

3. 형변환

4. 핵심 필드 검사

 

필드 검사 방법

float와 double을 제외한 기본 타입은 ==연산자로 비교

참조타입 필드는 equals 

float, double은 Float.compare, Double.compare 

배열은 Arrays.equals

 

주의사항

다를 가능성이 크거나 비교 비용이 낮은 필드 먼저 검사

파생필드를 비교하는 쪽이 더 빠르면 파생필드먼저 비교

equals를 재정의할 때는 hashCode도 재정의

equals의 입력타입은 항상 Object, @Override 사용

관련글 더보기