Java/java

Comparator<T> Interface 란?

우젼 2023. 2. 11. 02:35

지난번에는 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> 인터페이스를 활용하는데에 큰 문제는 없을것이라 생각 됩니다.