항목 | 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 |