[Effective Java] Comparable 인터페이스의 구현을 고려하자. |
-
compareTo 메소드는 Comparable 인터페이스에 존재하는 메소드이다.
compareTo 메소드는 equals 메소드와 유사한 특성을 갖는다.
차이점은 두 객체가 동일한지 비교에 덧붙여 순서까지 비교할 수 있으며, 제네릭 타입을 지원한다.
-
Comparable interface 를 구현하면, Arrays.sort 와 같은 메소드를 손쉽게 쓸 수 있고,
TreeSet 과 같은 크기 비교를 사용하는 Collection 들에서도 손쉽게 사용할 수 있다.
-
자바 라이브러리의 모든 값 클래스들은 Comparable 인터페이스를 구현한다.
-
알파벳 순, 숫자 순, 날짜 순과 같은 자연율을 갖는 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현해야 한다.
-
compareTo 메소드의 보편적 계약은 equals 와 비슷하다.
단, 순서판단하여 현재 객체의 값이 지정 객체의 값보다 작으면 음수 정수, 같으면 0, 크면 양수 정수 값을 반환한다.
비교할 수 없는 타입이면 ClassCastException 예외를 발생시킨다.
-
compareTo 계약 조항을 따르는 클래스에는, 저장 객체를 정렬 상태로 유지하는 컬렉션인 TreeSet, TreeMap 이 포함되며, 검색과 정렬 알고리즘을 갖고 있는 Collections 와 Arrays 유틸리티 클래스도 포함된다.
-
compareTo 메소드의 작성 방법은 equals 메소드와 유사하지만 몇 가지 중요한 차이가 있다.
compareTo 메소드의 인자로 전달되는 비교 객체의 타입은 컴파일 시점에서 미리 결정 된다. 따라서 compareTo 메소드 내부에서 비교 객체의 타입을 확인하거나 타입 변환을 할 필요가 없다.
만일 인자가 null 이면 가능한 빨리 NullPointerException 예외를 발생시켜야 한다.
-
비교할 필드가 여러 개인 클래스의 경우에는 비교하는 순서가 중요하다.
가장 우선되는 필드부터 시작해서 차례대로 비교해야 한다.
-
다음과 같은 형태의 코드가 가독성도 높고, 성능도 좋다.
// 해당 필드가 음수일 경우를 주의해서 사용해야 한다.
// 더 일반적으로 해당 필드의 최저값과 최고값의 차이가 MIN_VALUE 나 MAX_VALUE 보다 작거나 같아야 한다.
public int compareTo( PhoneNumber pn ){
int areaCodeDiff = areaCode - pn.areaCode;
if ( areCodeDiff != 0 )
return areaCodeDiff;
int prefixDiff = prefix - pn.prefix;
if ( prefixDiff != 0 )
return prefixDiff;
return lineNumber - pn.lineNumber;
}
'프로그래밍 놀이터 > 디자인 패턴, 리펙토링' 카테고리의 다른 글
[Effective Java] public 클래스에서는 public 필드가 아닌 접근자(accessor) 메소드를 사용한다. (0) | 2016.10.21 |
---|---|
[Effective Java] 클래스와 그 멤버의 접근성을 최소화하자. (0) | 2016.10.17 |
[Effective Java] clone 메소드는 신중하게 오버라이드 하자. (0) | 2016.10.10 |
[Effective Java] toString 메소드는 항상 오버라이드 하자. (0) | 2016.10.07 |
[Effective Java] equals 메소드를 오버라이드 할 때는 hashCode 메소드도 항상 같이 오버라이드 하자. (0) | 2016.10.05 |
댓글