Java
객체 비교를 위한 Comparator , Comparable
slown
2025. 2. 6. 16:16
목차
1.Comparable 인터페이스
2.Comparator 인터페이스
1.Comparable 인터페이스
Comparable 인터페이스는 객체 자신이 기본 정렬 방식을 정의할 때 사용됩니다. 즉, 특정 객체가 어떻게 비교될 것인지(순서 지정)를 해당 클래스 내에서 직접 정의합니다.
Comparable 인터페이스의 특징
- compareTo() 메서드를 오버라이드하여 비교 로직을 정의함
- 같은 타입의 객체끼리 비교 가능
- 자연 정렬(Natural Ordering)을 제공
- Collections.sort()에서 사용 가능
Comparable을 사용한 예시
import java.util.*;
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 Integer.compare(this.age, other.age); // 나이를 기준으로 오름차순 정렬
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
public class ComparableExample {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 35));
Collections.sort(people); // Comparable 기준 (나이 오름차순)으로 정렬
System.out.println(people);
}
}
출력 결과
[Bob (25), Alice (30), Charlie (35)]
위 예제에서 Person 클래스는 Comparable<Person>을 구현하여 compareTo() 메서드를 오버라이드했습니다. 따라서 Collections.sort()를 호출하면 자동으로 나이를 기준으로 오름차순 정렬됩니다.
2.Comparator 인터페이스
Comparator 인터페이스는 객체의 정렬 방식을 외부에서 정의할 때 사용됩니다. 즉, 같은 클래스의 객체라도 여러 기준으로 정렬해야 하는 경우에 활용됩니다.
Comparator 인터페이스의 특징
- compare() 메서드를 오버라이드하여 비교 로직을 정의함
- 동일한 객체에 대해 여러 개의 정렬 기준을 적용할 수 있음
- Collections.sort() 또는 List.sort()에서 사용 가능
- 기존 클래스에 변경 없이 새로운 정렬 기준을 적용할 수 있음
Comparator 의 예시
import java.util.*;
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return name + " (" + age + ")";
}
}
// 나이 기준 정렬
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge());
}
}
// 이름 기준 정렬
class NameComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getName().compareTo(p2.getName());
}
}
public class ComparatorExample {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 35));
// 나이 기준 정렬
Collections.sort(people, new AgeComparator());
System.out.println("나이 기준 정렬: " + people);
// 이름 기준 정렬
Collections.sort(people, new NameComparator());
System.out.println("이름 기준 정렬: " + people);
}
}
출력 결과
나이 기준 정렬: [Bob (25), Alice (30), Charlie (35)]
이름 기준 정렬: [Alice (30), Bob (25), Charlie (35)]
위 코드에서는 AgeComparator와 NameComparator를 각각 만들어서 나이 기준 정렬과 이름 기준 정렬을 다르게 적용했습니다.