728x90
반응형
요새 정렬에 관련된 문제를 접해보고 있고, 제가 아직은 많이 써보지 못한 인터페이스에 대해 오늘은 알려드릴려고 합니다. 그것은 바로 Comparable과 Comparator입니다.
Comparable과 Comparator는 둘 다 Java에서 객체를 정렬하는 데 사용되는 인터페이스입니다. 이 두 인터페이스는 비슷한 목적을 가지고 있지만, 사용 방법과 용도가 다릅니다. 각각의 인터페이스에 대해 자세히 설명하고, 사용 방법 및 차이점을 비교해 보겠습니다.
Comparable 인터페이스
Comparable 인터페이스는 객체 자신이 다른 객체와 비교할 수 있도록 함. 주로 객체의 기본 정렬 기준을 정의할 때 사용.
사용 방법
- Comparable 인터페이스를 구현할 클래스에 implements Comparable<T>를 추가.
- compareTo 메서드를 오버라이드하여 객체 간 비교 로직을 정의.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Student implements Comparable<Student> {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
@Override
public int compareTo(Student other) {
// 점수를 기준으로 오름차순 정렬
return Integer.compare(this.score, other.score);
}
@Override
public String toString() {
return name + ": " + score;
}
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("홍길동", 88));
students.add(new Student("김철수", 75));
students.add(new Student("이영희", 95));
Collections.sort(students);
for (Student student : students) {
System.out.println(student);
}
}
}
- 위 예제에서는 Student 클래스가 Comparable<Student>를 구현하고 compareTo 메서드에서 점수를 기준으로 오름차순 정렬하도록 정의. Collections.sort를 사용하면 자동으로 compareTo 메서드가 호출되어 정렬됨.
Comparator 인터페이스
Comparator 인터페이스는 두 객체를 비교할 수 있도록 함. 주로 클래스 외부에서 여러 가지 기준으로 정렬해야 할 때 사용함.
사용 방법
- Comparator 인터페이스를 구현한 클래스를 정의하거나 익명 클래스 또는 람다식을 사용하여 compare 메서드를 오버라이드함.
- compare 메서드에서 두 객체 간의 비교 로직을 정의함.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
@Override
public String toString() {
return name + ": " + score;
}
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("홍길동", 88));
students.add(new Student("김철수", 75));
students.add(new Student("이영희", 95));
// 점수를 기준으로 오름차순 정렬하는 Comparator
Comparator<Student> scoreComparator = new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return Integer.compare(s1.score, s2.score);
}
};
Collections.sort(students, scoreComparator);
for (Student student : students) {
System.out.println(student);
}
// 이름을 기준으로 오름차순 정렬하는 Comparator
Comparator<Student> nameComparator = new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return s1.name.compareTo(s2.name);
}
};
Collections.sort(students, nameComparator);
for (Student student : students) {
System.out.println(student);
}
}
}
- 위 예제에서는 Student 클래스가 Comparable 인터페이스를 구현하지 않았음. 대신 Comparator 인터페이스를 사용하여 외부에서 정렬 기준을 정의함. Collections.sort를 사용할 때 Comparator를 전달하여 원하는 기준으로 정렬.
차이점 정리
특성ComparableComparator
특성 | Comparable | Comparator |
패키지 | java.lang | java.util |
비교 메서드 | compareTo(T o) | compare(T o1, T o2) |
정의 위치 | 비교할 클래스 내부 | 비교할 클래스 외부 |
변경 가능성 | 클래스 정의를 수정해야 함 | 클래스 정의를 수정할 필요 없음 |
사용 용도 | 기본 비교 방식이 하나일 때 | 여러 가지 기준으로 비교해야 할 때 |
사용 방법 | Collections.sort(List<T>) | Collections.sort(List<T>, Comparator<T>) |
자바 8 이상 | N/A | 람다식을 사용하여 간결하게 정의 가능 |
- "Comparable"은 클래스 내부에서 기본 정렬 방식을 정의하는 데 사용되며, compareTo 메서드를 통해 자연 정렬 순서를 구현합니다.
- "Comparator"는 클래스 외부에서 다양한 정렬 방식을 정의하는 데 사용되며, compare 메서드를 통해 여러 정렬 기준을 적용할 수 있습니다.
- 자바 8에서는 Comparator를 람다식을 통해 더 간결하게 정의할 수 있으며, 다양한 기본 메서드를 제공하여 정렬 작업을 쉽게 수행할 수 있습니다.
결론
Comparable은 클래스 자체에서 비교 로직을 정의하는 반면, Comparator는 외부에서 비교 로직을 정의할 수 있어 유연성이 더 높습니다. 여러 기준으로 객체를 정렬해야 하는 경우 Comparator를 사용하는 것이 더 적합합니다.
https://github.com/bottomsUp-99?tab=repositories
728x90
반응형
'자료구조' 카테고리의 다른 글
자바 컬렉션 프레임워크 (0) | 2024.07.10 |
---|---|
자바 스트림(Stream)이란? (0) | 2024.07.03 |
ConcurrentHashMap VS ConcurrentSkipListMap 이란? (0) | 2024.06.19 |
AuthProvider VS Provider 이란? (0) | 2024.06.19 |
Map이란? (0) | 2024.06.19 |