본문 바로가기

programming/java

Item 14. Comparable을 구현할지 고려하라.

[WHY]

  1. Comparable을 구현한 객체들의 배역은 손쉽게 정렬할 수 있다
  2. 검색, 극단 값 계산, 자동 정렬되는 컬랙션 관리도 쉽게 할 수 있다.

[WHEN]

알파벳, 숫자, 연대 같이 순서가 명확한 값 클래스를 작성할 때

[HOW]

  • compareTo 규약
  1. 두 객체의 참조를 바꾸어도 예상한 결과가 나와야 한다.
  2. 추이성을 만족시켜야 한다. a < b < c → a < c
  3. 크기가 같은 객체들 끼리는 어떤 객체와 비교하더라도 항상 같아야 한다.
  4. 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;
}
  1. 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);
}