본문 바로가기
Java

[JAVA] Comparator 란? (feat. Generics )

by onejunu 2021. 2. 24.

- 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는 함수형 인터페이스이기 때문에 람다형으로 간단하게 만들 수도 있다.

 

<메인 함수 실행 결과>

 

댓글