[Java] Comparable 구현
박싱된 기본 타입 클래스의 compare 이용하기
자바 7부터 박싱된 기본 타입 클래스에서 정적 메서드인 compare를 지원한다.
@Override
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 비교자 생성 메서드 이용하기
private static final Comparator<PhoneNumber> COMPARATOR =
comparingInt((PhoneNumber) pn -> pn.areaCode)
.thenComparingInt(pn -> pn.prefix)
.thenComparingInt(pn -> pn.lineNum);
@Override
public int compareTo(Test o) {
return COMPARATOR.compare(this, pn);
}
주의점
- 비교자(뺄셈)를 이용한 구현의 경우 오버플로우, 부동소수점 계산 방식 등 오류가 발생할 수 있으므로 지양해야 한다.
compareTo를 이용한 동치 결과와equals를 이용한 동치 결과가 같을 것을 권장한다. 정렬 기능을 지원하는 컬렉션의 경우 동치 판단을compareTo로 하기 때문이다. 예를 들어BigDecimal("1.0")과BigDecimal("1.00")의equals동치 결과는false이지만compareTo동치 결과는true이므로HashSet은 원소를 2개 갖지만 BST인TreeSet은 1개의 원소를 가지게 된다.
댓글남기기