본문 바로가기

JAVA

Comparator / Comparable 인터페이스

Comparator / Comparable 인터페이스란?

컬렉션을 정렬하는데 필요한 메서드를 정의한다. 그렇다면 둘의 차이는?

 

Comparable - comparaTo(Object o1) - 기본 정렬 기준

Comparator - compare(Object o1, Object o2) - 다른 정렬 기준

 

두 메서드의 반환형은 int로 0, 1, -1을 반환한다.

o1 == o2 -> 비교하는 두 객체가 같으면 0

o1  <  o2 -> 비교하는 값보다 작으면 -1,

o1  >  o2 -> 비교하는 값보다 크면 1

 

// 기본 정렬 기준
public interface Comparable {
	int compareTo(Object o1); // 객체 자신(this)과 o1을 비교
}

// 다른 정렬 기준
public interface Comparator {
	int compare(Object o1, Object o2); // o1과 o2를 비교
	boolean equals(Object obj);
}

 

여기에서 말하는 기본 정렬 기준이란, 자바에서 자체적으로 Comparable을 구현하고 있는 클래스들을 말한다.

쉽게 말해, Arrays.sort()를 바로 사용할 수 있는 클래스들을 까보면 이미 Comparable을 구현하고 있는 것을 알 수 있다.

 

참고로, 기본 정렬 기준은 공백, 숫자, 대문자, 소문자 순으로 정렬된다.

유니코드의 순서가 작은 값에서부터 큰 값으로 정렬된다고 보면 된다.


🔎예제

 

원래 Arrays.sort(정렬 대상, 정렬 기준)이지만, 기본 정렬 기준을 사용할 때는 Arrays.sort(정렬 대상)으로 사용한다.

어떻게 이렇게 사용할 수 있느냐?

무턱대고 모두 다 사용할 수 있는 것은 아니고, Compatable을 구현한 클래스에 한해서 기본 정렬 기준을 사용할 수 있다.

정렬 기준이 이미 정의되어 있기 때문에 정렬 기준을 정해주지 않으면 이미 구현되어 있는 기준으로 정렬해주는 것이다.

 

만약, 정렬 기준을 새롭게 정의해주고 싶다면 Comparator 인터페이스를 구현하여 compare() 메서드를 오버라이딩 해주면 된다.

 

package java11;

import java.util.Arrays;
import java.util.Comparator;

public class Ex11_7 {

	public static void main(String[] args) {
	
		String[] strArr = { "cat", "Dog", "lion", "tiger" };
		
		// String이 이미 Comparable을 구현하였기 때문에 
		// 생략하면 이미 구현되어 있는 기본 정렬 기준으로 정렬됨
		Arrays.sort(strArr); 
		System.out.println(Arrays.toString(strArr)); // [Dog, cat, lion, tiger]

		
		// 대소문자를 구별하지 않고 정렬하기 위해 String 클래스에 정의된 static 변수를 사용하자
		// CASE_INSENSITIVE_ORDER도 까보면 Comparator를 구현하고 있다
		// 왜? 기본 정렬 기준이 아닌, 대소문자를 무시하여 정렬하므로 Compatable이 아니라 Comparator를 구현
		Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
		System.out.println(Arrays.toString(strArr)); // [cat, Dog, lion, tiger]
		
		
		// 역순 정렬을 하기 위해 Comparator를 구현한 Descending 클래스를 받아옴
		Arrays.sort(strArr, new Descending());
		System.out.println(Arrays.toString(strArr)); // [tiger, lion, cat, Dog]
		
	}
	
}

class Descending implements Comparator<String> {

	@Override
	public int compare(String o1, String o2) {
		
		String c1 = o1;
		String c2 = o2;
		return c1.compareTo(c2) * -1;
		// compareTo()는 기본 정렬 기준임. 거기에 -1을 곱하면 역순으로 출력.
		// 또는, c2.compareTo(c1) 도 동일한 값을 얻을 수 있음.
		
	}
	
}

'JAVA' 카테고리의 다른 글

다형성 / 동적 바인딩 / 인터페이스 / 추상클래스  (0) 2021.01.18
static은 언제 붙일까?  (0) 2021.01.14
지네릭스  (0) 2021.01.11
Collection 클래스 정리  (0) 2021.01.10
Collections  (0) 2021.01.10