Language/Java

[Java] 자바 컬렉션 프레임워크 - Comparable과 Comparator

재은초 2024. 4. 21. 10:50
반응형

Comparable<T> 인터페이스

  • Comparable 인터페이스는 객체를 정렬하는 데 사용되는 메소드인 compareTo() 메소드를 정의하고 있다.
  • 자바에서 같은 타입의 인스턴스를 서로 비교해야만 하는 클래스들은 모두 Comparable 인터페이스를 구현하고 있다. 따라서 Boolean을 제외한 래퍼 클래스나 String, Time, Date와 같은 클래스의 인스턴스는 모두 정렬 가능하다. 이때 기본 정렬 순서는 작은 값에서 큰 값으로 정렬되는 오름차순이다.
class Car implements Comparable<Car> {
    private String modelName;
    private int modelYear;
    private String color;
 
    Car(String mn, int my, String c) {
        this.modelName = mn;
        this.modelYear = my;
        this.color = c;
    }
 
    public String getModel() {
        return this.modelYear + "식 " + this.modelName + " " + this.color;
    }
 
    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));
    }
}

>> 1

Comparable<T> 메소드

 

Comparator<T> 인터페이스

  • Comparator 인터페이스는 Comparable 인터페이스와 같이 객체를 정렬하는 데 사용되는 인터페이스다.
  • Comparable 인터페이스를 구현한 클래스는 기본적으로 오름차순으로 정렬된다. 반면에 Comparator 인터페이스는 내림차순이나 아니면 다른 기준으로 정렬하고 싶을 때 사용할 수 있다. 이때 Comparator 인터페이스를 구현한 클래스에서는 compare() 메소드를 재정의하여 사용한다.
import java.util.*;
 
class DescendingOrder implements Comparator<Integer> {
    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());
        }
    }
}

>> 40
>> 30
>> 20
>> 10

Comparator<T> 메소드

 

Reference

반응형