Comparable
은 객체를 비교하기위한 인터페이스입니다. 이 인터페이스의 메소드는 딱 하나가 있습니다. 바로 compareTo()
입니다.
일반적으로 단순 비교보다는 비교 후 정렬에 많이 활용됩니다.
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
는 객체를 비교하기위한 인터페이스입니다.
마찬가지로 단순 비교보다는 비교 후 정렬에 많이 활용됩니다.
네 둘 다 하는 일은 모두 객체를 비교하기 위한 인터페이스입니다. 주 용도 또한 비교 후 정렬을 위해서 많이 사용됩니다.
그렇다면 두 인터페이스는 무슨 차이일까요? 간단명료하게 정리하면 다음과 같습니다.
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;
}
}
}