티스토리 뷰

이펙티브 자바 Effective Java 2/E
국내도서
저자 : 조슈아 블로크(Joshua Bloch) / 이병준역
출판 : 인사이트 2014.09.01
상세보기

Comparable 인터페이스를 구현한 객체들은 자연적 순서를 갖게 된다.

아래의 코드는 String이 Comparable을 구현하고 있다는 사실을 이용하여 명령행 인자들을 알파벳 순서로 정렬하는 동시에 중복을 제거하고 있다.

public WordList{ public static void main(String[] args) { Set<String> s = new TreeSet<String>(); Collections.addAll(s, args); System.out.println(s); } }

Comparable을 구현한 클래스는 다양한 제네릭 알고리즘 및 Comparable 인터페이스를 이용하도록 작성된 컬렉션 구현체와도 전부 연동할 수 있다.

적은 노력으로도 엄청난 결실을 거둘 수 있는 것이다.

public interface Comparable<T> { int compareTo(T t); }

compareTo 메서드의 일반 규약은 equals와 비슷하다.

이 객체의 값이 인자로 주어진 객체보다 작으면 음수
이 객체의 값이 인자로 주어진 객체와 같다면 0
이 객체의 값이 인자로 주어진 객체보다 크다면 양수
비교할 수 없는 자료형이라면 ClassCastException 예외를 던진다.

sgn(expression)은 signum 함수로서 -1, 0, 1을 expressiong 에 따라서 반환한다.
1. sgn(x.compareTo(y)) == -(sgn(y.compareTo(x)) 를 성립.
2. 추이성이 만족되도록 해야 한다. x.compareTo(y) > 0 && y.compareTo(z) > 0 이면
     x.compareTo(z) 이여야 한다.
3. x.compareTo(y) == 0 이면 sgn(x.compareTo(z)) == sgn(y.compareTo(z) 가 성립.
4.( x.compareTo(y)==0) == (x.equals(y)) 성립

위 규약을 지키지 않은 compareTo 를 가진 클래스는 비교 연산에 기반한 클래스들을 오작동시킬 수 있다. (TreeSet, TreeMap, sorted collection, Arrays, Collections...)

클래스에 선언된 중요 필드가 여러 개인 경우, 필드 비교 순서가 중요하다.
가장 중요한 필드부터 시작해서 차례로 비교해야 한다.
비교 결과가 0이 아닌 값이면 비교를 중단하고 결과를 반환한다.

public int compareTo(PhoneNumber pn) { if (areaCode < pn.areaCode) return -1; if (areaCode > pn.areaCode) return 1; if (prefix < pn.prefix) return -1; if (prefix > pn.prefix) return 1; if (lineNumber < pn.lineNumber) return -1; if (lineNumber > pn.lineNumber) return 1; return 0; }


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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 31
글 보관함