- Comparator : 기본 정렬기준이 아닌 다른 기준으로 사용하고 싶을 때 사용. Comparator는 인터페이스임.
- Comparator 구조
Comparator 는 함수형 인터페이스이기 때문에 람다식으로도 표현할 수 있다. 함수형 인터페이스에 관한 내용은 나중에 자세히 다룰 것이다. 여기서 중요한 것은 Comparator 안에 있는 compare 함수다. 사실 Comparator 인터페이스 내부에는 많은 함수들이 존재하지만 compare에 관해서만 정리하겠다.
compare 를 구현함으로써 임의의 클래스에 대해서 정렬 기준을 만들 수 있다. 예시를 들면서 살펴본다.
- Comparator 예시
먼저 아래처럼 클래스들을 선언한다. Phone은 iphone 과 galaxy의 부모이다. 또한 모든 클래스들을 담아서 리스트로 만들 수 있는 PhoneBox 를 Generics 형태의 클래스로 만들었다.
만약 Iphone 을 정렬하고 싶다면 어떻게 해야 할까? 아래처럼 Comparator를 생성하면된다.
class IphoneComp implements Comparator<Iphone> {
int compare(Iphone p1, Iphone p2) {
return p1.price - p2.price;
}
}
그러면 Galaxy를 정렬하고 싶다면 어떻게 해야 할까? 이 또한 Comparator를 생성하면된다.
class GalaxyComp implements Comparator<Galaxy> {
int compare(Galaxy p1, Galaxy p2) {
return p1.price - p2.price;
}
}
중복된 느낌이 들지 않는가?
그래서 Iphone 과 Galaxy를 모두 동일한 기준으로 정렬하기 위해서 부모클래스인 Phone의 Comparator만 정의하면 Iphone과 Galaxy 모두 정렬기준을 만들 수 있다.
실제로 Collections.sort 를 보면 아래와 같다.
Comparator<? super T> 부분이 핵심이다.
T 가 여기서는 Iphone 이라면 Iphone의 부모들인 Phone 과 Object의 Comparator가 인자로 들어갈 수 있다는 말이다.
T 가 Galaxy라면 Galaxy , Phone, Object 가 Comparator 인자로 들어갈 수 있다. Iphone 과 Galaxy 의 공통 부모인 Phone의 Comparator를 정의하면 된다.
즉 아래처럼 Comparator를 작성하면 된다.
이제 Comparator를 사용해보자.
Iphone 과 Galaxy에 모두 Phone Comparator 를 사용하여 정렬하는 모습을 보여주고 있다.
또한 Comparator는 함수형 인터페이스이기 때문에 람다형으로 간단하게 만들 수도 있다.
<메인 함수 실행 결과>
'Java' 카테고리의 다른 글
[JAVA] Enum 내부 동작원리를 중심으로 알아보기 (0) | 2021.02.26 |
---|---|
[JAVA] ArrayList remove for loop ( ConcurrentModificationException) (0) | 2021.02.24 |
[JAVA] Comparable 이란? (0) | 2021.02.19 |
[JAVA] next_permutation, prev_permutation (0) | 2020.09.19 |
백트래킹을 이용한 순열 in java (0) | 2020.08.30 |
댓글