Comparable과 Comparator
- 객체 정렬에 필요한 메서드를 정의한 인터페이스, 즉 정렬기준을 제공한다
- Comparable
- 기본 정렬기준을 구현하는데 사용
- 하나의 객체를 다른 객체와 비교
- Comparator
- 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용
- 타입이 동일한 두 개의 객체를 비교
// java.lang
public interface Comparable<T> {
public int compareTo(T o); // 주어진 객체(o)를 자신(this)과 비교
}
// java.util
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2); // o1, o2 두 객체를 비교
boolean equals(Object obj); // equals를 오버라이딩하라는 뜻
}
- compare()와 compareTo()는 두 객체의 비교결과를 int값으로 반환하도록 작성한다
- 왼쪽이 크면 양수(+), 오른쪽이 크면 음수(-), 같다면 0
예제
배열을 정렬하는 예제를 보고 실제 Comparable과 Comparator가 어떻게 동작하는지 살펴보자
public class CompareTest {
public static void main(String[] args) {
String[] arr = {"cat", "Dog", "lion", "tiger"};
// 1. Comparable에 의한 정렬
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
// 2. String에서 제공하는 Comparator에 의한 정렬, 대소문자 구분 X
Arrays.sort(arr, String.CASE_INSENSITIVE_ORDER);
System.out.println(Arrays.toString(arr));
// 3. 직접 구현한 Comparator에 의한 정렬, 1의 반대
Arrays.sort(arr, new Descending());
System.out.println(Arrays.toString(arr));
}
}
class Descending implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if (o1 instanceof Comparable && o2 instanceof Comparable) {
Comparable c1 = (Comparable) o1;
Comparable c2 = (Comparable) o2;
return c2.compareTo(c1); // c1.compareTo(c2) * -1
}
return -1;
}
}
출력결과
[Dog, cat, lion, tiger] <- 1. Comparable에 의한 정렬
[cat, Dog, lion, tiger] <- 2. String에서 제공하는 Comparator에 의한 정렬, 대소문자 구분 X
[tiger, lion, cat, Dog] <- 3. 직접 구현한 Comparator에 의한 정렬, 1의 반대
sort 메서드에 인자로 배열만 넘긴다면 Comparable에 의한 정렬을 실행하게 된다.
Arrays.java - 인자로 배열 하나만 전달받는 경우
- sort -> legacyMergeSort -> mergeSort -> Comparable.compareTo
- sort -> ComparableTimSort.sort -> ComparableTimSort.binarySort -> Comparable.compareTo
최종적으로 compareTo가 호출되는 것을 알 수 있다. 이를 통해 객체의 기본적인 정렬기준으로 정렬이 이루어진다는 사실을 확인할 수 있다.
sort 메서드에 인자로 배열만 넘긴다면 Comparable에 의한 정렬을 실행하게 된다.
Arrays.java - 인자로 배열과 Comparator를 같이 전달받는 경우
- sort -> legacyMergeSort -> mergeSort -> Comparable.compare
- sort -> Timsort.sort -> Timsort.binarySort -> Comparable.compare
최종적으로 compare가 호출되는 것을 알 수 있다.
(2022.12.27 추가) 우연히 너무나 잘 정리해둔 글을 발견해 링크를 남긴다.
https://namocom.tistory.com/871?category=503607
참고
'프로그래밍 언어 > Java + Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 유용한 함수 - padEnd (0) | 2022.07.19 |
---|---|
[Kotlin] 코틀린에선 빌더 패턴(Builder Pattern) 대신 data class를 사용하라 (0) | 2022.06.22 |
[Java] 스터디 17주차: 자동차 경주 게임 만들기 (0) | 2021.10.04 |
[Java] 스터디 16주차: 문자열 계산기 만들어보기 (0) | 2021.09.28 |
[Java] 스터디 15주차: 람다식 (0) | 2021.09.24 |