Collections
`java.util.Collections` 클래스는 자바 컬렉션 프레임워크의 유틸리티 클래스로, 정적 메서드들을 제공하여 다양한 컬렉션 객체에 대한 작업을 수행할 수 있게 합니다. 이 중 'sort()' 메서드는 리스트를 정렬하는 데 사용됩니다.
public static <T extends Comparable<? super T>> void sort(List<T> list)
- <T extends Comparable<? super T>> : 리스트의 요소 타입 'T'는 'Comparable'인터페이스를 구현한 클래스여야 한다.
- List<T> list : 정렬할 리스트
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(5);
numbers.add(2);
numbers.add(8);
numbers.add(1);
// 정렬 전
System.out.println("정렬 전: " + numbers);
// 정렬
Collections.sort(numbers);
// 정렬 후
System.out.println("정렬 후: " + numbers);
}
}
Comparable
'Collections.sort()' 메서드는 정렬할 객체의 클래스가 'Comparable' 인터페이스를 구현하고 있을 경우에 사용 가능하다. 'Comparable'을 구현한 클래스는 'compareTo()' 메서드를 오버라이드하여 정렬 기준을 정의해야 한다.
public class Persons implements Comparable<Person> {
private String name;
private int age;
@Override
public int compareTo(Person other) {
if (this.age > other.age) return 1;
else if (this.age < other.age) return -1;
else {
return this.name.compareTo(other.name);
}
}
}
...
List<Person> people = ...;
...
Collections.sort(people);
...
Collections.sort() 메서드 사용 시 정렬하려는 객체의 타입이 'Comparable'을 구현하고 있지 않다면 컴파일 에러가 발생한다. 또한, 별도의 정렬 기준을 사용하고자 한다면 Comparator를 사용할 수도 있다.
Comparator
Comparator는 자바에서 객체의 비교를 사용자가 직접 지정할 수 있도록 하는 인터페이스 입니다. 이 인터페이스는 두 객체를 비교하는 'compare()' 메서드를 정의하고 있습니다.
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
...
}
- 'compare(T o1, T o2)' : 두 객체 'o1'과 'o1'를 비교하는 메서드. 정렬 기준을 정의하며, 반환 값에 따라 오름차순, 내림차순이 결정됨.
- 0 이하 : 'o1'이 'o2'보다 앞에 위치 (오름차순 기준)
- 0 이상 : 'o1'이 'o2'보다 뒤에 위치 (내림차순 기준)
● Comparator 인터페이스 구현체
class AgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
// 나이를 기준으로 비교
return Integer.compare(p1.getAge(), p2.getAge());
}
}
● Comparator 구현체 사용 예시
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 25));
people.add(new Person("Bob", 30));
people.add(new Person("Charlie", 20));
// AgeComparator를 사용하여 정렬
Collections.sort(people, new AgeComparator());
// 정렬 후 출력
for (Person person : people) {
System.out.println(person.getName() + ": " + person.getAge() + " years old");
}
}
}
Comparable과 Comparator는 각각 어떤 상황에 적합한가?
Comparable 인터페이스는 자연 정렬(natural ordering)을 지원할 때 사용합니다. 예를 들어, 클래스가 이미 정의된 순서 또는 기준에 따라 정렬될 수 있을 때 'Comparable'을 구현합니다. 만약 클래스가 'Comparable' 인터페이스를 구현하면, 그 객체들은 기본적으로 해당 클래스의 기준에 따라 정렬됩니다.
Comparable 인터페이스는 Comparator 인터페이스처럼 별도의 클래스를 생성하거나 작성할 필요 없이 그냥 호출하여 바로 사용할 수 있다는 장점이 있다.
Comparator 인터페이스는 외부에서 정렬 기준을 제공하거나, 기존에 정의된 기준 외에 다른 방식으로 정렬하고 싶을 때 사용합니다. 클래스의 코드를 변경할 수 없는 경우에 유용합니다.
정리하면, 클래스 자체가 이미 정렬 기준을 가지고 있고 그것을 사용하고자 한다면 'Comparable', 외부에서 정렬 기준을 제공하거나 변경 가능한 경우에는 'Comparator'를 사용합니다.
참고 출처
- https://javagoal.com/java-comparable-and-comparator/
- https://haenny.tistory.com/349
- https://wjheo.tistory.com/entry/Java-%EC%A0%95%EB%A0%AC%EB%B0%A9%EB%B2%95-Collectionssort
'알고리즘' 카테고리의 다른 글
[알고리즘] 힙 구조와 힙 정렬 (2) | 2023.11.25 |
---|---|
[알고리즘] 병합 정렬과 퀵 정렬 (0) | 2023.10.26 |