[WHY]
- Comparable을 구현한 객체들의 배역은 손쉽게 정렬할 수 있다
- 검색, 극단 값 계산, 자동 정렬되는 컬랙션 관리도 쉽게 할 수 있다.
[WHEN]
알파벳, 숫자, 연대 같이 순서가 명확한 값 클래스를 작성할 때
[HOW]
- compareTo 규약
- 두 객체의 참조를 바꾸어도 예상한 결과가 나와야 한다.
- 추이성을 만족시켜야 한다. a < b < c → a < c
- 크기가 같은 객체들 끼리는 어떤 객체와 비교하더라도 항상 같아야 한다.
- Wrapper class compare method
박싱된 기본 타입 클래스에서 정적 메서드 compare를 이용해서 값을 비교한다. 관계 연산자 < > 은 오류를 유발할 가능성을 내포하고 있기 때문에 정적 메서드 사용을 더 권고한다. 특히 실수 타입을 비교할 때는 관계 연산자는 오류를 유발할 가능성이 있기 때문에 반드시 compare 메서드를 이용해야 한다.
public int compareTo(PhoneNumber pn){
int result = Short.compare(areaCode, pn.areaCode);
if (result == 0) {
result = Short.compare(prefix, pn.prefix);
if (result == 0)
result = Short.compare(lineNum, pn.lineNum);
}
return result;
}
- Comparator construction method
간결하고 가독성 좋은 방법을 원한다면 이 방법을 고려할 수 있다. 하지만 약간의 성능 저하가 있기 때문에 성능을 원한다면 첫 번째 방법을 사용하는 것이 좋다.
private static final Comparator<PhoneNumber> COMPARATOR = Comparator
.comparingInt( (PhoneNumber pn) -> pn.areaCode)
.thenComparingInt(pn -> pn.prefix)
.thenComparingInt(pn -> pn.lineNum);
public int compareTo(PhoneNumber pn){
return COMPARTOR.compare(this, pn);
}
'programming > java' 카테고리의 다른 글
Item 15. 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2023.04.24 |
---|---|
Item 13. clone 재정의는 주의해서 진행하라. (0) | 2023.04.18 |
Item 12. toString을 항상 재정의하라. (0) | 2023.04.17 |
Item 11. equals 재정의할 때 hashCode도 정의하라 (0) | 2023.03.29 |
Item 10. equals 일반 규약을 지켜 재정의하라 (0) | 2023.03.28 |