2월 23, 2024

Comparator vs. Comparable Interface (자바 두 인터페이스 차이점 및 사용법)

Java 객체를 정렬하기 위해서 우리는 Comparator와 Comparable Interface를 많이 사용한다. 

특히 어떠한 배열이 있고 그것을 정렬하기 위해서

Arrays.sort (); 를 많이 사용하는데 이것의 기준이 되는 정렬 기준을 우리가 Comparator/ Comparable을 사용해서 명시해줄 수 있다. 각각 모두 객체 정렬의 기준을 제공해주어서 비슷하지만, 사용법은 살짝 다르다.

 

1. Comparable Interface (java.lang.Comparable)

 

정렬할 때 기본적으로 적용되는 정렬기준이 되는 메서드를 정의해준다. 

예를 들어 정수의 경우 우리가 Comparable Interface를 implements하지 않아도 자연스럽게 오름차순으로 정렬이 되는데 이 이유는 이미 Integer class가 Comparable Interface를 implements 하고 있기 때문이다. 

 

반면, 우리가 직접 만들어준 클래스의 경우에는 디폴트로 Comparable Interface가 implements 되어 있지 않기 때문에 직접 implements를 해주어야 한다.

 

<사용법>

Comparable Interface를 직접 implements해준다면 반드시 compareTo() 메서드를 오버라이드해주어야 한다. 

compareTo() 메서드의 매개변수는 한 개만 들어가는데, 매개변수로 들어온 객체와 class의 현재 객체와의 순서를 비교해주겠다는 뜻이다. 

따라서 리턴값이 음수/ 0/ 양수라는 세 가지 상황에 따라서 순서가 바뀌게 된다. 

  1. return 값 음수 : 현재 객체 < 매개변수로 들어온 객체
  2. return 값 0 : 현재 객체 == 매개변수로 들어온 객체
  3. return 값 양수: 현재 객체 > 매개변수로 들어온 객체

이렇기 때문에 자신이 원하는 순서로 정렬이 되도록 compareTo() 메서드를 조정해주면 된다. 

 

class Lecture implements Comparable<Lecture> {
    int start, end;

    @Override
    public int compareTo(Lecture lec) {
       return this.start-lec.start;
}

위와 같이 사용해주면 강의 시간의 시작 시간을 기준으로 정렬하게끔 implements를 해준 것이다. 시작시간의 오름차순으로 정렬해주고 싶다면 this와 lec을 바꾸면 된다. 

 

이렇게 해준 뒤에 Arrays.sort() 나 만약 list라면 Collections.sort() 를 사용해서 정렬해주면 위에서 만들어놓은 기준대로 정렬이 되는 것을 알 수 있다.


2. Comparator Interface  (java.util.Comparator)

 

정렬하고자 하는 클래스들의 기본 정렬 기준과는 다른 방식으로 정렬하고 싶을 때 사용하는 인터페이스 

 

기본적으로 우리가 정수는 Comparable interface를 사용하여서 오름차순으로 정렬되어 있도록 설정되어 있다. 하지만 만약 우리가 정렬을 내림차순으로 하고 싶거나, 특별한 자신만의 기준으로 하고 싶을 때 Comparator Inteface를 사용해주면 된다. 

comparator class를 하나 만들어준 이후에 

Arrays.sort(배열 이름, comparator class이름);

이런식으로 sorting을 해주면 된다.

 

<사용법>

comparator interface를 구현할 때는 compare()이라는 메서드를 구현해주어야 한다. 

compare()는 위의 compareTo()와는 다르게 매개변수를 두 개를 요구한다. 즉 현재 객체와 매개변수 객체가 아니라 매개변수로 들어온 두 개 객체의 순서를 비교해주는 식인 것이다. 

 

이것도 마찬가지도 반환값이 음수/0/양수이냐에 따라서 순서가 결정된다.

  1. return 값이 음수: 매개변수 1< 매개변수 2
  2. return 값이 0: 매개변수 1 == 매개변수 2
  3. return 값이 양수: 매개변수 1> 매개변수 2
class Comp implements Comparator<Lecture> {
  @Override
  public int compare(Lecture l1, Lecture l2) {
   return l1.start-l2.start;
}

위와 같이 Comp이라는 class를 만들어주고 return 값을 명시해주면 Lecture이라는 class의 객체들을 정렬해줄 수 있다.