EFFECTIVE JAVA
EFFECTIVE JAVA TIL 14 - 모든 객체의 공통 메서드 / 아이템 14
daehee719
2024. 8. 2. 03:40
728x90
Comparable을 구현할지 고려하라
Comparable의 compareTo는 Object의 equals와 동일하지만 2가지 다른점이 존재한다.
- 동시성 비교 + 순서 비교
- 제네릭 형태
public static void main(String[] args)
{
Set<String> s = new TreeSet<>(); //TreeSet (순서 정렬 + 중복제거)
Collections.addAll(s, args);
System.out.println(s);
}
Comparable을 구현한 객체는 순서가 존재함으로 Arrays.sort로 쉽게 정렬할 수 있다.
String이 Comparatable을 구현되어있으므로 가능한 코드이다.
순서가 명확한 값 클래스를 작성한다면 반드시 Comparable 인터페이스를 구현하자.
CompareTo메서드 규약
- 두 객체의 참조의 순서를 바꿔 비교해도 예상한 결과가 나와야 한다.
- 첫 번째가 두 번째보다 크고 두 번째가 세 번째보다 크면, 첫 번째는 세 번째보다 커야 한다
- 크기가 같은 객체들끼리는 어떤 객체와 비교하더라도 항상 같아야 한다.
- (필수X) compareTo 메서드로 수행한 동치성 테스트 결과가 equals의 결과와 같아야 한다.
- 지키지 않을 경우, 컬렉션이 구현한 인터페이스 (Collection, Set, Map 등) 에 정의된 동작과 다르게 작동할 수 있다.
- 정렬된 컬렉션들은 동치성을 비교할 때 equals 대신 compareTo를 사용하기 때문이다.
compareTo 메서드 작성 요령
- Comparable은 제네릭 인터페이스이므로 타입을 확인하거나 형변환할 필요 없다.
- 객체 참조 필드를 비교하려면 compareTo 메서드를 재귀적으로 호출이 필요하다.
- Comparable을 구현하지 않은 필드나 표준이 아닌 순서로 비교해야 한다면 Comparator를 대신 사용한다.
- 정수 기본 타입, 실수 기본 타입을 비교할 때는 박싱된 기본 타입 클래스들에 새로 추가된 정적 메서드인 compare를 이용한다.
- 클래스에 핵심 필드가 여러 개라면 가장 핵심적인 필드부터 비교한다.
Comparator
자바 8에서는 Comparator 인터페이스가 비교자 생성 메서드를 제공하여 메서드 연쇄 방식으로 비교자를 생성할 수 있다.
이를 활용하여 Comparable 인터페이스의 compareTo 메서드를 구현 가능하다.
728x90