Comparable (java.lang), Comparator (java.util)

 

항목 Comparable Comparator
위치 클래스 내부에서 정의 클래스 외부에서 정의
인터페이스 Comparable Comnparator
주요 메서드 compareTo(T o) compare(T o1, T o2)
수정 가능성 원본 클래스 수정 필요 기존 클래스 수정 없이 사용 가능
유연성 하나의 기준만 사용 가능 여러 정렬 기준 구현 가능

Comparable 인터페이스

  • 자연 정렬 순서(natural order)을 정의할 때 사용
  • 클래스 내부에서 정렬 기준을 직접 정의
int compareTo(T o);
// this < o -> 음수 반환
// this == o -> 0 반환
// this > o -> 양수 반환

 

🔎 사용방법

  • Comparable<T> 인터페이스를 implement하고 compareTo(T o) 메서드를 오버라이드해서 구현
public 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; // 나이 기준 오름차순 정렬
    }
}
List<Person> list = ...;

Collections.sort(list);

 


 

Comparator 인터페이스

  • 외부에서 정렬 기준을 정의할 때 사용
  • 기존 클래스를 수정하지 않고 다양한 정렬 기준 만들 수 있음
int compare(T o1, T o2);
// o1 < o2 -> 음수 반환
// o1 == o2 -> 0 반환
// o1 > o2 -> 양수 반환 

 

🔎 사용방법 1️⃣ : Comparator 클래스 이용

Comparator<T> 인터페이스를 implement하고, compare(T o1, T o2) 메서드를 오버라이드해서 구현

public class NameComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.name.compareTo(p2.name); // 이름 기준 오름차순
    }
}
List<Person> list = ...;

Collections.sort(list, new NameComparator());

 

🔎 사용방법 2️⃣ : Lambda expression 이용

List<Person> list = ...;

// 나이 기준 오름차순
Collections.sort(list, (p1, p2) -> p1.getAge() - p2.getAge());
List<String> words = List.of("apple", "banana", "kiwi");

// 문자열 일이 기준 정렬
List<String> sorted = new ArrayList<>(words);
sorted.sort((s1, s2) -> s1.length() - s2.length());

 

🔎 사용방법 3️⃣ : Comparator method referece

List<Person> list = ...;

list.sort(Comparator.comparing(Person::getName)); // 이름 오름차순
list.sort(Comparator.comparingInt(Person::getAge)); // 나이 오름차순
List<String> words = List.of("Banana", "Apple", "Cherry");

// 문자열 알파벳 순 정렬
List<String> sorted = new ArrayList<>(words);
sorted.sort(String::compareToIgnoreCase);

 


 

Comparable vs Comparator

// 공통 예시
List<Person> list = new ArrayList<>();
list.add(new Person("Alice", 25));
list.add(new Person("Bob", 20));

 

// Comparable 기준 정렬 (age 오름차순)
Collections.sort(list);
  • Person 내에 Comparable을 구현했으므로 매개값이 필요없음
  • 람다식/메서드 참조 ❌

 

// Comparator 기준 정렬 (이름 오름차순)
Collections.sort(list, new NameComparator());
  • 외부에서 정의한 Comparator 인스턴스를 매개값으로 넣음

'Java' 카테고리의 다른 글

자바의 다형성(polymorphism)  (0) 2025.05.01
Map.Entry (java.util)  (0) 2025.05.01
Collection 프레임워크  (0) 2025.04.29
JDK, JRE, JVM  (1) 2025.04.22
데이터 타입 분류 - JAVA  (0) 2025.04.20