[Java] Comparable과 Comparator

Bam·2024년 3월 15일
0

Java

목록 보기
71/98
post-thumbnail

Comparable

Comparable은 객체를 비교하기위한 인터페이스입니다. 이 인터페이스의 메소드는 딱 하나가 있습니다. 바로 compareTo()입니다.

일반적으로 단순 비교보다는 비교 후 정렬에 많이 활용됩니다.

  • int compareTo(T o): 객체와 o를 비교해서 o와 같으면 0, o보다 작으면 -1, o보다 크면 1을 반환합니다.

Comparable은 엄청 많은 인터페이스, 구현 클래스에서 사용되고 있습니다. 익숙한 것만 이야기하면 Integer, Float, String과 같은 타입들이 있죠.

모든 내용은 공식 문서를 참조해주세요.

그리고 당연한 이야기지만 여러분들이 비교하는 것을 클래스에 넣고싶다면 메소드를 만들지말고 Comparable을 implements해서 오버라이딩하면 됩니다.

public class Main {
    public static void main(String[] args) {
        Integer num1 = 1;
        Integer num2 = 10;

        System.out.println(num1.compareTo(num2));
    }
}

num1이 비교대상인 num2보다 작으므로 -1을 반환합니다.


Comparator

Comparator는 객체를 비교하기위한 인터페이스입니다.

마찬가지로 단순 비교보다는 비교 후 정렬에 많이 활용됩니다.

  • int compare(T o1, T o2): o1과 o2를 비교해서 비교 기준에 따라 -1, 0, 1을 반환합니다.

Comparable 과 Comparator

네 둘 다 하는 일은 모두 객체를 비교하기 위한 인터페이스입니다. 주 용도 또한 비교 후 정렬을 위해서 많이 사용됩니다.

그렇다면 두 인터페이스는 무슨 차이일까요? 간단명료하게 정리하면 다음과 같습니다.

  • Comparable: 자바의 기본 정렬 기준(오름차순) 구현에 사용 (java.lang)
  • Comparator: 기본 정렬 기준 외의 기준을 구현하고자 할 때 사용 (java.util)

Comparable은 기본 정렬 기준인 오름차순을 구현하고자 할 때 사용하고, Comparator는 내림차순이나 기타 정렬 기준을 구현하고자 할 때 사용합니다.

특히 Comparator는 Comparable을 구현하지 않은 객체를 컬렉션에 저장하는 경우 사용하게 됩니다.


다시 돌아와서 Comparator는 Comparable을 구현하지 않는 객체를 비교하고자 할 때 비교 기준을 만들어서 compare()를 오버라이딩해 비교한다고 했습니다.

다음은 Comparable을 구현하지 않은 객체입니다. 따라서 해당 타입의 객체는 compareTo()를 통해 비교할 수 없겠죠.

public class Fruit {
    String name;
    int price;

    public Fruit(String name, int price) {
        this.name = name;
        this.price = price;
    }
}

이 객체를 Comparator 객체를 만들어서 compare를 오버라이딩해 비교 기준을 새로 만들고 비교를 실시해 결과를 출력하는 예제 코드입니다.

public class Main {
    public static void main(String[] args) {
        Comparator<Fruit> comparator = new Comparator<Fruit>() {
            @Override	//비교 기준을 위한 Comparator 객체 생성, compare 오버라이딩
            public int compare(Fruit o1, Fruit o2) {
                if (o1.price == o2.price) {
                    return 0;
                }
                else if (o1.price > o2.price) {
                    return 1;
                }
                else {
                    return -1;
                }
            }
        };

        Fruit fruit1 = new Fruit("사과", 9000);
        Fruit fruit2 = new Fruit("바나나", 6000);

        int result = comparator.compare(fruit1, fruit2);

        switch (result) {
            case 0:
                System.out.println("사과와 배 가격이 같음");
                break;
            case -1:
                System.out.println("사과가 바나나보다 저렴함");
                break;
            case 1:
                System.out.println("사과가 바나나보다 비쌈");
                break;
        }
    }
}

0개의 댓글

관련 채용 정보