티스토리 뷰
프로그래밍/Effective Java
[Effective Java] 08. equals를 재정의할 때는 일반 규약을 따르라.
Reference M1 2019. 4. 23. 00:45equals 메서드는 재정의하기 쉬워 보이지만 실수할 여지도 많다. 이런 문제를 피하는 가장 간단한 방법은 equals 메서드를 재정의 하지 않는 것이다.
아래 조건 중 하나라도 만족하면 equals 메서드를 재정의 하지 않아도 된다.
- 각각의 객체가 고유한 경우
- 상위 클래스에서 재정의한 equals가 하위 클래스에서 사용하기에도 적당 한 경우
그렇다면 Object.equals를 재정의하는 것이 바람직할 때는 언제인가?
- 객체 동일성(Object equality)이 아닌 논리적 동일성(Logical equality)의 개념을 지원하는 클래스인 경우
- 상위 클래스의 equals가 하위 클래스의 필요를 충족하지 못하는 경우
값 클래스(Value Class)는 대체로 그 조건에 부합한다. Value Class (Integer. Date 등)는 단순히 어떤 값을 표현하는 클래스이다. 이런 경우 두 객체가 같은 값을 확인하기 위해 equals를 사용하지 같은 객체인지 확인하려고 equals를 사용하지 않는다. Map이나 Set의 요소로 사용될 경우 equals 메서드의 오버라이딩이 꼭 필요하다. 같은 값의 객체가 이미 있는지 비교하는 수단으로 제공되어야 하기 때문이다.
equals 메서드 재정의 일반 규약 (general contract)
동치관계
- 반사성 : 모든 객체가 자기 자신과 같아야 한다. null이 아닌 참조 x가 있을 때 x.equals(x)는 true를 반환한다.
- 대칭성 : 두 객체에 서로 같은지 물으면 같은 답이 나와야 한다. null이 아닌 참조 x, y가 있을 때 x.equals(y)가 true 이면 y.equals(x)는 true를 반환한다.
- 추이성 : 첫 번째 객체가 두 번째 객체와 같고, 두 번째 객체가 세 번째 객체와 같다면 첫 번째와 세 번째 객체도 같아야 한다. null이 아닌 참조 x, y, z가 있을 때 x.equals(y)가 true이고 y.equals(z)가 true 이면 x.equals(z)도 true이다.
- 일관성 : 같다고 판정된 객체들은 추후 변경되지 않는 한 계속 같아야 한다. null이 아닌 참조 x, y가 있을 때 값의 변화가 없는 경우 x.equals(y) true 이면 횟수에 상관없이 항상 true이다.
equals 메서드 재정의 일반 규약을 종합해 보면 다음과 같은 지침을 얻을 수 있다.
- == 연산자를 사용하여 equals의 인자가 자기 자신인지 검사하라
- instanceof 연산자를 사용하여 인자의 자료형이 정확한지 검사하라.
- equals의 인자를 정확한 자료형으로 반환하라.
- '중요' 필드 각각이 인자로 주어진 객체의 해당 필드와 일치하는지 검사하라.
- equals를 구현할 때는 hashCode도 재정의하라.
- equals 메서드 인자형을 Object에서 다른 것으로 바꾸지 마라. (equals 메서드에 @Override 키워드를 일관되게 사용하면 이런 실수를 피할 수 있다.)
- equals 메서드 구현을 끝냈다면 대칭성, 추이성, 일관성의 세 속성이 만족되는지 검토하라.
'프로그래밍 > Effective Java' 카테고리의 다른 글
[Effective Java] 10. toString은 항상 재정의하라. (0) | 2019.04.28 |
---|---|
[Effective Java] 09. equals를 재정의할 때는 반드시 hashCode도 재정의하라. (0) | 2019.04.24 |
[Effective Java] 07. 종료자 사용을 피하라. (0) | 2019.04.21 |
[Effective Java] 06. 유효기간이 지난 객체 참조는 폐기하라. (0) | 2019.04.21 |
[Effective Java] 05. 불필요한 객체는 만들지 마라. (0) | 2019.03.26 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
TAG
- effective java
- 프로그래머스
- 자바스크립트
- Maven
- 오라클
- React
- 정렬 알고리즘
- 회고
- 오라클 내장 함수
- 자바
- Tomcat
- 리액트
- 리액트 16
- 소프트웨어공학
- Linux 명령어
- sort algorithm
- 성능분석
- 제주도 여행
- 개발환경
- 제주도 3박4일 일정
- Eclipse
- 이직
- SQL
- Collection
- 경력관리
- spring
- Java
- javascript
- 리눅스 명령어
- 프로그래머
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함