본문 바로가기

Java

Java Comparable, Comparator 인터페이스

 

Comparable과 Comparator는 객체 정렬에 필요한 메서드(정렬 기준 제공)를 정의한 인터페이스

 

 

1. Comparable

- java.lang 패키지

- 기본 정렬 기준을 구현하는데 사용

public interface Comparable<T> {

    public int compareTo(T o); // 주어진 객체(o)를 자신과 비교
    // 반환값은 int형이지만 실제로 비교하는 객체가 같을 시 0, 비교하는 값보다 작으면 음수, 크면 양수
}

- Comparable을 구현하는 클래스는 같은 타입의 인스턴스끼리 서로 비교할 수 있는 Integer, String, Date, File 등이 있음

- 기본적으로 오름차순으로 구현됨(정렬)

 

 

2. Comparator

- java.util 패키지

-  기본 정렬 기준 외에 다른 기준으로 정렬하고자할 때 사용

public interface Comparator<T> {
    int compare(T o1, T o2); // o1, o2 두 객체를 비교 
    //  반환값은 int형이지만 실제로 비교하는 객체가 같을 시 0, 비교하는 값보다 작으면 음수, 크면 양수

    boolean equals(Object obj); // equals는 모든 클래스가 가진 공통적 메서드이지만 compare를 구현하는 클래스는 오버라이딩이 필요할 수 있다는 것을 뜻함

    default Comparator<T> reversed() {
        return Collections.reverseOrder(this);
    }
        
// 생략...
}

- compare()메소드는 매개변수인 o1, o2 두 객체를 비교

 

 

3. Comparator와 Comparable 예제

import java.util.*;

class Ex11_7 {
	public static void main(String[] args) {
		String[] strArr = {"cat", "Dog", "lion", "tiger"};

		Arrays.sort(strArr); // Arrays.sort()는 Comparator를 지정하지 않은 경우, Comparable 구현체에 구현된 내용에 따라 정렬 - 기본 정렬기준(사전순 ABC...abc)
		System.out.println("strArr=" + Arrays.toString(strArr));

		Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // Arrays.sort()는 Comparator를 CASE_INSENSITIVE_ORDER(대소문자 구분 안함)으로 지정한 경우
		System.out.println("strArr=" + Arrays.toString(strArr));

		Arrays.sort(strArr, new Descending()); // Arrays.sort()는 Comparator를 Descending()(내림차순 정렬)로 지정한 경우
		System.out.println("strArr=" + Arrays.toString(strArr));
	}
}

// Comparator 구현
class Descending implements Comparator { // 기본 정렬 기준 외에 다른 기준으로 정렬하고자 할 경우 사용하는 Comparator 인터페이스, 여기서는 역순으로 정렬하기 위해 사용
	public int compare(Object o1, Object o2){
		if( o1 instanceof Comparable && o2 instanceof Comparable) { // 형변환 가능 여부 검사 instanceof()
			Comparable c1 = (Comparable)o1; // Comparable의 compareTo()메서드를 사용하기 위해 형변환
			Comparable c2 = (Comparable)o2; // Comparable의 compareTo()메서드를 사용하기 위해 형변환
			return c1.compareTo(c2) * -1 ; // -1을 곱해서 기본 정렬 방식의 역으로 변경(양수 -> 음수, 0 -> 0, 음수 -> 양수)
						                // 또는  c2.compareTo(c1)와 같이 순서를 바꿔도 됨
		}
		return -1;
	} 
}

 

 

4. 정렬(Sort)

- 두 대상을 비교하여 자리 바꿈을 반복

- 정렬의 방법은 버블, 삽입, 선택 ,퀵 등 의 방법이 있음, 정렬 기준이 달라짐

- 우리는 정렬 대상과 정렬 기준을 제시해주면 됨