
Comparable과 Comparator는 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다.
| Comparable | Comparator |
|---|---|
| 객체 자체가 비교 방법을 정의 | 외부에서 비교 방법을 정의 |
| 클래스 내부에서 구현 | 별도의 클래스로 구현 |
| 주로 객체의 자연 순서를 정의할 때 사용 | 필요에 따라 여러 정렬 기준을 제공할 때 사용 |
| compareTo 메서드를 통해 기본 정렬 기준 제공 | compare 메서드를 통해 다양한 정렬 기준 제공 |
Comparable 인터페이스는 다음과 같다.
✍️ 작성
public interface Comparable<T> {
/**
* 객체 자신(this)와 지정된 객체를 비교하여 순서를 정한다.
*
* @param o 비교할 객체
* @return 비교 결과:
* 1) 자신이 비교 대상보다 작으면 음수,
* 2) 같으면 0,
* 3) 크면 양수
*/
public int compareTo(T o);
}
compareTo 메서드를 구현한다.
Comparator 인터페이스는 다음과 같다.
✍️ 작성
import java.util.Comparator;
public interface Comparator<T> {
/**
* 두 객체를 비교하여 순서를 정한다.
*
* @param o1 첫 번째 비교할 객체
* @param o2 두 번째 비교할 객체
* @return 비교 결과:
* 1) 첫 번째 객체가 두 번째 객체보다 작으면 음수,
* 2) 같으면 0,
* 3) 크면 양수
*/
int compare(T o1, T o2);
/**
* 두 객체가 같은지 비교한다.
* (이 메서드는 일반적으로 Object의 equals 메서드로 대체될 수 있다)
*
* @param obj 비교할 객체
* @return 두 객체가 같으면 true, 그렇지 않으면 false
*/
boolean equals(Object obj); // 이 메서드는 일반적으로 생략 가능
}
compare 메서드를 구현한다.
Comparable과 Comparator의 사용 예시는 다음과 같다.
✍️ 작성
class Dollar implements Comparable<Dollar> {
private final Integer amount;
public Dollar(Integer amount) {
this.amount = amount;
}
@Override
public int compareTo(Dollar o) {
return amount.compareTo(o.amount);
}
public Integer getAmount() {
return amount;
}
}
class DollarComparator implements Comparator<Dollar> {
@Override
public int compare(Dollar o1, Dollar o2) {
return o2.getAmount().compareTo(o1.getAmount()); // 내림차순 비교
}
}
// Comparable 사용 예시
List<Dollar> dollars = Arrays.asList(new Dollar(10), new Dollar(5), new Dollar(20));
Collections.sort(dollars); // Comparable을 사용한 기본 정렬
// Comparator 사용 예시
List<Dollar> dollars = Arrays.asList(new Dollar(10), new Dollar(5), new Dollar(20));
Collections.sort(dollars, new DollarComparator()); // Comparator를 사용한 특정 기준 정렬
본문 코드에서 Comparable은 클래스 자체 내부에서 정의를 하여 기본 정렬 기준으로 사용되며, Comparator는 외부에서 비교 방법을 정의하여 다양한 정렬 기준을 추가로 제공할 때, 사용됨을 알 수 있다.
자바의 정석 3판 (남궁성)