Comparable / Comparator

tryoo0607·2025년 8월 6일

들어가며

알고리즘 공부 중 새로 알게 된 Comparable / Comparator 에 대해 작성하였습니다.



Comparable

특징

  • 객체의 자연 정렬(natural ordering)을 정의하기 위한 인터페이스
  • java.lang.Comparable<T> 에 속함
  • 구현 클래스는 반드시 compareTo(T o) 메서드를 오버라이딩해야 함
  • 정렬이 필요한 컬렉션(TreeSet, TreeMap, Collections.sort() 등)에서 사용됨

메서드

  • int compareTo(T o)

    → 현재 객체(this)와 매개변수 객체(o)를 비교

    → 음수: this < o, 0: this == o, 양수: this > o

특징/제약

  • 한 클래스는 하나의 Comparable 구현만 가능 (즉, 하나의 정렬 기준만 가질 수 있음)
  • 여러 기준이 필요하다면 Comparator를 사용해야 함

활용 예시

class Person implements Comparable<Person> {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Person other) {
        return this.age - other.age; // 나이 오름차순 정렬
    }
}


Comparator

특징

  • 객체의 사용자 정의 정렬(custom ordering)을 정의하기 위한 인터페이스
  • java.util.Comparator<T> 에 속함
  • 별도의 클래스(혹은 람다/익명 클래스)로 구현해 다양한 정렬 기준을 정의할 수 있음
  • 정렬이 필요한 메서드(Collections.sort(), List.sort(), TreeSet, TreeMap) 등에 전달 가능

메서드

  • int compare(T o1, T o2)

    → 두 객체 o1, o2를 비교

    → 음수: o1 < o2, 0: o1 == o2, 양수: o1 > o2

특징/제약

  • 한 클래스에 대해 여러 Comparator 구현 가능
  • 자바 8부터는 람다와 Comparator.comparing() 등을 사용하면 간단히 작성 가능

활용 예시

import java.util.*;

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

// 나이 기준 정렬
Comparator<Person> ageComparator = new Comparator<>() {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.age - p2.age;
    }
};

// 이름 기준 정렬 (람다)
Comparator<Person> nameComparator = (p1, p2) -> p1.name.compareTo(p2.name);

List<Person> list = Arrays.asList(
    new Person("Kim", 30),
    new Person("Lee", 25),
    new Person("Park", 28)
);

// 정렬 기준을 자유롭게 교체 가능
list.sort(ageComparator);
list.sort(nameComparator);


Comparable vs Comparator 비교

구분ComparableComparator
위치클래스 내부 구현별도 구현 (외부 클래스, 익명 클래스, 람다 등)
메서드compareTo(T o)compare(T o1, T o2)
정렬 기준한 클래스 당 1개만 가능하나의 클래스에 대해 여러 개 정의 가능
사용 용도기본(자연) 정렬 기준 설정사용자 정의 정렬 기준 설정
대표 활용처TreeSet, TreeMap, Collections.sort()Collections.sort(), List.sort(), TreeSet


요약

  • Comparable → 클래스 자체에 자연 정렬 기준을 정의할 때 사용
  • Comparator → 클래스 외부에서 다양한 정렬 기준을 정의할 때 사용


마치며

읽어주셔서 감사합니다.




참고자료

자바 [JAVA] - Comparable 과 Comparator의 이해
[Java] 자바 객체 정렬 Comparable과 Comparator의 이해
[Java] Comparable과 Comparator로 객체 정렬하기
Comparable과 Comparator 어렵지 않습니다

0개의 댓글