IT/Programming / / 2023. 4. 27. 09:48

<Effective Java> RULE 12 Comparable 구현을 고려하라

반응형

 

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

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

자바 플랫폼 라이브러리에 포함된 거의 모든 값 클래스들은 Comparable 인터페이스를 구현한다. 알파벳 순서나 값의 크기, 또는 시간적 선후관계처럼 명확한 자연적 순서를 따르는 값 클래스를 구현할 때는 Comparable 인터페이스를 구현할 것을 반드시 고려해 봐야 한다.

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

CompareTo의 일반규약

 모든 X와 Y에 대해 sgn(x.compareTo(y)) == -sgn(y,compareTo(x))가 만족되도록 해야 한다.(예외가 발생한다면 모두 그래야 하며 역도 성립해야한다.)

 추이성이 만족되도록 해야 한다. (x.compareTo(y) > 0 && y.compareTo(z) > 0) 이면 x.compareTo(z) > 0이어야 한다.

 x.compareTo(y) == 0 이면 sgn(x.compareTo(z)) == sgn(y.compareTo(z))의 관계가 모든 z에 대해 성립하도록 해야 한다.

 만약 이 조건을 만족하지 않는다면 서두에 주석에다 그 사실을 적어야 한다.

 “주의 : 이 클래스의 객체들은 equals에 부합하지 않는 자연적 순서를 따른다.”

 

비교대상인 두 객체가 서로다른 클래스에 속한경우, ,ClassCastException을 던지는 것이 허용되어 ㅣㅇㅆ다.

CompareTo규약이 서로 다른 클래스 객체 사이의 비교를 금하지는 않지만, 버전 1.6플랫폼 라이브러리에 속한 어떤 클래스도 그런 비교를 허용하지 않는다.

 

equals에 부합하지 않느 순서를 사용하는 클래스라 해도 동작하기는 하지만 정렬된 컬렉션(Collection, Set, Map)에 저장할 경우 해당 컬렉션은 컬렉션 인터페이스의 일반규약을 위반하게 될 수 있다.

이런 인터페이스의 일반 규약이 equals 메서드를 기반으로 작성되었지마 실제 동치성은 equals대신 compareTo를 통해 검사하기 때문이다.

 

 

 

 

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유