Skip to main content

[Java] Comparator


1. Comparator 이란?

Comparator<T>함수형 인터페이스로, 객체 T를 비교하는 기준을 개발자가 직접 정의해서 정렬, 검색, 정렬된 자료구조(TreeSet 등)에 활용할 수 있게 도와준다. 한 마디로 말하면 Comparator는 정렬 기준을 외부에서 정의할 수 있게 도와주는 도구이다. compare() 메서드를 오버라이드해서 기준을 만들고, 필요하면 람다로 간결하게 표현가능한 것이 장점이다. 다양한 정렬 조건을 유연하게 만들 수 있어서 실무에서 자주 쓰인다. 특히 TreeMap, TreeSet, PriorityQueue 등에서 자주 활용된다.

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
}

이렇게 생겼고, 핵심 메서드는 compare(T o1, T o2)이다.


2. Comparator vs Comparable 🔍

항목

Comparable

Comparator

위치

클래스 내부

외부에서 별도로 정의

메서드

compareTo()

compare()

사용 예

Collections.sort(list)

Collections.sort(list, comparator)

정렬 기준

하나만 구현 가능

여러 기준 가능

  • Comparable은 객체 자신이 정렬 기준을 가진다 (자체 비교)
  • Comparator는 외부에서 비교 기준을 제공한다 (객체 외부에서 비교)

3. 사용 예시

1. 기본 정렬 기준이 없는 클래스

class User {
    String name;
    int age;
    
    User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

이럴 때 나이를 기준으로 정렬하고 싶으면 Comparator가 필요하다.

List<User> users = new ArrayList<>();
users.add(new User("Alice", 30));
users.add(new User("Bob", 20));

users.sort(new Comparator<User>() {
    @Override
    public int compare(User u1, User u2) {
        return Integer.compare(u1.age, u2.age); // 오름차순
    }
});

또는 람다 표현식으로 줄일 수 있다.

users.sort((u1, u2) -> Integer.compare(u1.age, u2.age));

2. 내림차순 정렬

users.sort((u1, u2) -> Integer.compare(u2.age, u1.age)); // 나이 내림차순

3. 이름 오름차순 + 나이 내림차순

users.sort((u1, u2) -> {
    int nameCompare = u1.name.compareTo(u2.name);
    if (nameCompare == 0) {
        return Integer.compare(u2.age, u1.age); // 이름 같으면 나이 내림차순
    }
    return nameCompare;
});

4. Comparator 유틸 메서드들 (Java 8 이상)

Comparator.comparingInt(User::getAge) // 나이 오름차순
Comparator.comparing(User::getName).reversed() // 이름 기준 내림차순
Comparator.comparing(User::getName)
          .thenComparing(Comparator.comparingInt(User::getAge).reversed()) 
// 이름 오름차순, 같으면 나이 내림차순

참고 자료 : chatGPT