[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 |
---|---|---|
위치 | 클래스 내부 | 외부에서 별도로 정의 |
메서드 |
|
|
사용 예 |
|
|
정렬 기준 | 하나만 구현 가능 | 여러 기준 가능 |
- 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