Comparator<T> Interface 란?
지난번에는 Comparable<T>에 대해 알아보았습니다.
그 과정에서 Integer.compare() 메서드를 사용했었는데요, 이 부분에 대해 의문이 생길 수 있다 생각이 되었고, 저 또한 그러한 이유에서 공부했었기 때문에 정리해봅니다.
먼저 compare() 메서드는 매개변수로 들어오는 두 요소를 비교해주는 기능을 제공합니다. Comparable<T>에서 사용한 compareTo() 메서드와 이름이 비슷하여 했갈릴 수 있습니다. 하지만 compare()는 두개의 요소를 비교하는데 사용되고 compareTo() 메서드는 받은 인자와 자신을 비교하는데 사용됩니다.
그리고 compare() 메서드를 사용하기 위해 사용되는 것이 Comparator<T> 인터페이스 입니다.
비교하고자 하는 객체의 클래스를 T로 지정하고 어떻게 비교할 것인지를 직접 구현하는 것으로 compare() 메서드를 사용할 수 있습니다.
그리고 여기서 Comparator<T> 인터페이스를 Implements한 클래스를 객체화 하면 Collectios.sort() 에도 사용이 가능합니다.
원래 Collections.sort() 메서드는 Comparable<T>를 implements하여 구현해주었던 compareTo() 메서드를 기준으로 정렬이 되지만 이때에는 Comparator<T>에서 compare() 메서드를 기준으로 정렬하게 됩니다.
사용 코드는 아래와 같습니다.
public class Main {
public static void main(String[] args){
ArrayList<Test> list = new ArrayList<>();
Test test1 = new Test(1);
Test test2 = new Test(2);
Test test3 = new Test(3);
Test test4 = new Test(4);
TestComparator com = new TestComparator();
list.add(test4); list.add(test2); list.add(test3); list.add(test1);
Collections.sort(list);
System.out.println("Collections.sort()만 사용");
for(Test t: list) {
System.out.println(t.a);
}
Collections.sort(list, com);
System.out.println("\nComparator<T> 인터페이스와 함께 사용");
for(Test t: list) {
System.out.println(t.a);
}
}
}
class Test implements Comparable<Test>{
int a;
public Test(int a) {
this.a = a;
}
@Override
public int compareTo(Test o) {
return this.a-o.a;
}
}
class TestComparator implements Comparator<Test>{
@Override
public int compare(Test o1, Test o2) {
return o2.a - o1.a;
}
}
결과는 아래와 같습니다
Collections.sort()만 사용했을 때에는 Comparable<T>에서 구현했던 대로 오름차순으로 정렬이 되는것을 확인할 수 있습니다.
그리고 Comparator<T> 인터페이스를 사용한 클래스 TestComparator 객체를 함께 사용함으로 compare에서 구현해줬듯이 내림차순으로 정렬이 되는것을 확인할 수 있습니다.
쉽게 했갈릴 수 있겠다 라고 생각을 했던 부분은 Comparator<T> 인터페이스를 사용할때에 비교하고자 하는 클래스를 T에 넣고 해당 클래스인 객체만 비교할 수 있다는 것이었습니다. 이 부분만 했갈리지 않게 주의한다면 Comparable<T>과 Comparator<T> 인터페이스를 활용하는데에 큰 문제는 없을것이라 생각 됩니다.