본문 바로가기
Java

Comparable과 Comparator

by Backchus 2019. 1. 24.

Comparable<T> 인터페이스

Comparable 인터페이스는 객체를 정렬하는 데 사용되는 메소드인 compareTo() 메소드를 정의하고 있다.

자바에서 같은 타입의 인스턴스를 서로 비교해야만 하는 클래스들은 모두 Comparable 인터페이스를 구현하고 있다.

따라서 Boolean을 제외한 Wrapper클래스나 String, Time, Date와 같은 클래스의 인스턴스는 모두 정렬 가능하다.

이때 기본 정렬 순서는 작은 값에서 큰 값으로 정렬되는 오름차순이 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
 
class Car implements Comparable<Car> {
    private String modelName;
    private int modelYear;
    private String color;
 
    Car(String modelName, int modelYear, String color) {
        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
    }
 
    public String getModel(){
        return this.modelYear + "식 " + this.modelName + " " + this.color;
    }
 
    @Override
    public int compareTo(Car obj) {
        if(this.modelYear == obj.modelYear){
            return 0;
        } else if(this.modelYear < obj.modelYear){
            return -1;
        } else {
            return 1;
        }
    }
}
 
public class Comparable01 {
    public static void main(String[] args) {
        Car car01 = new Car("아반떼"2016"노란색");
        Car car02 = new Car("소나타"2010"흰색");
 
        System.out.println(car01.compareTo(car02));
    }
}
 
cs

실행결과 : 1


Comparable 인터페이스는 다음과 같은 메소드를 사용하여 객체를 정렬한다.

메소드 

설명 

    int compareTo(T obj)

해당 객체와 전달된 객체의 순서를 비교함. 


Comparator<T> 인터페이스

Comparator 인터페이스는 Comparable 인터페이스와 같이 객체를 정렬하는 데 사용되는 인터페이스다.

Comparable 인터페이스를 구현한 클래스는 기본적으로 오름차순으로 정렬된다. 

반면에 Comparator 인터페이스는 내림차순이나 아니면 다른 기준으로 정렬하고 싶을 때 사용할 수 있다.

즉, Comparator 인터페이스를 구현하면 오름차순 이외의 기준으로도 정렬할 수 있게 되는 것이다.

이때 Comparator 인터페이스를 구현한 클래스에서는 compare() 메소드를 재정의하여 사용하게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
 
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
 
class DescendingOrder implements Comparator<Integer> {
    @Override
    public int compare(Integer o1, Integer o2) {
        if(o1 instanceof Comparable && o2 instanceof Comparable){
            Integer c1 = (Integer) o1;
            Integer c2 = (Integer) o2;
            return c2.compareTo(c1);
        }
        return -1;
    }
}
 
public class Comparable02 {
    public static void main(String[] args) {
        TreeSet<Integer> ts = new TreeSet<Integer>(new DescendingOrder());
 
        ts.add(30);
        ts.add(40);
        ts.add(20);
        ts.add(10);
 
        Iterator<Integer> iter = ts.iterator();
        while(iter.hasNext()){
            System.out.println(iter.next());
        }
    }
}
 
 
cs


Comparator 인터페이스는 다음과 같은 메소드를 사용하여 객체를 정렬한다.

메소드 

설명 

int compare(T o1, T o2)

전달된 두 객체의 순서를 비교함. 

boolean equals(Object obj) 

해당 comparator와 전달된 객체가 같은지를 확인함. 

 default Comparator<T> reverse()

해당 comparator의 역순인 comparator를 반환함. 


참고링크: http://tcpschool.com/java/java_collectionFramework_comparable (TCPSchool)

'Java' 카테고리의 다른 글

예외 발생 및 회피  (0) 2019.01.25
예외 클래스  (0) 2019.01.25
예외 처리  (0) 2019.01.25
파일 입출력  (0) 2018.11.14
01. StringTokenizer 클래스  (0) 2018.10.04