Comparable
Comparable 인터페이스는 타입을 받는 인터페이스이며 메서드의 타입은 컴파일시점에 결정된다.
순서를 고려해야하는 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현하여, 인스턴스들을 쉽게 정렬, 검색, 비교 가능한 컬렉션과 어우러지도록하는게 좋다.
compareTo 규약
compareTo 규악은 equals 규악과 비슷하나 compareTo 메서드는 각 필드가 동치인지 비교하는게 아닌 순서를 비교한다.
compareTo는 주어진 객체의 순서를 비교하며, 주어진 객체보다 작으면 음의 정수 같으면 0 크면 양의 정수를 반환한다.
만약 비교할 수 없는 타입의 객체가 주어지면 ClassCastException을 던지며 추가 규악은 아래와 같다.
- Comparable을 구현한 클래스는 모든x, y에대해 sgn(x.compareTo(y) == -sgn(y.comapreTo(x))여야함
- Comparable을 구현한 클래스는 추이성을 보장해야함. (x.compareTo(y) > && y.compareTo(z)> 0)이면 x.compareTo(z) > 이여함
- Comparable을 구현한 클래스는 모든 z에대해 x.compareTo(y) == 0 이면 sgn(x.compareTo(z)) == sgn(y.comapreTo(z)) 이다.
- Comparable을 구현한 클래스는 (x.compareTo(y) == 0) == (x.equals(y))여야함. 이 권고는 필수는 아니지만 지키는게 좋음
만약 규약을 지키지 않는다면 TreeeSet, TreeMap, 검색과 정렬 알고리즘을 활용하는 유틸 클래스인 Collections와 Arrays를 사용하지 못할 수 있다.
모든 객체에 대해 전역 동치관계를 부여하는 equals와 달리 compareTo는 타입이 다른 객체를 신경쓰지 않아도됨. 만약 타입이 다르면 ClassCastException을 던져도됨
Comparator
Comparable을 구현 구현하지 않은 필드나 표준이 아닌 순서로 비교해야한다면 Comprator를 대신 사용하면 좋다.
compareTo 메서드 재정의시 메서드 관계연산자와 <, > 비교 연산자는 피하라
Double.compare, Float.compare, < , > 와 같은 연산자는 거추장스럽고 오류를 유발하기 쉬우니 피하자.
대신 Comparator 인터페이스가 일련의 비교자 생성 메서드와 메서드 연쇄 방식으로 비교자를 생성 할 수 있으니 그것을 사용하자.
'book review > Effective java' 카테고리의 다른 글
[Effective Java] Item 13. clone 재정의는 주의해서 진행하라 (0) | 2024.07.01 |
---|---|
[Effective Java] Item 12. toString을 항상 재 정의하라 (0) | 2024.04.11 |
[Effective Java] Item 11. equals를 재정의하려거든 hashCode도 재정의 해라 (0) | 2024.03.18 |
[Effective Java] Item 10. equals는 일반 규약을 지켜 재 정의하라 (0) | 2024.03.11 |
[Effective Java] Item 9. try-finally보다는 try-with-resources를 사용하라 (0) | 2024.02.14 |