
⭐ Comparable와 Comparator은 모두 인터페이스(interface)이다. 그렇기에 이 두 개를 사용하려고 하면 반드시 인터페이스 내에 선언된 메소드를 '구현'해야 한다. 이 두 개의 인터페이스는 객체를 정렬하기 위해 사용한다.
우리는 단순히 이것을 정렬에 이용한다는 사실만 기억하고 있다. 하지만, 근본적으로는 값들의 비교 결과를 리턴한다는 것이다.
자기 자신과 매개변수를 비교하는 것으로
compareTo(T o)라는 메소드를 반드시 구현해야 한다.
✅ 밑에 코드를 보면서 Comparable에 대해 알아보자
import java.util.Comparator;
import java.util.SortedMap;
public class Test2{
public static void main(String[] args) {
Product product1 = new Product(10000, "치마");
Product product2 = new Product(20000, "후드티");
int isExpensive = product1.compareTo(product2);
if(isExpensive>0){
System.out.println(product1.name + "가 " + product2.name +"보다 비쌉니다.");
}else if(isExpensive==0){
System.out.println("두 제품의 가격이 동일합니다. ");
}else{
System.out.println(product2.name + "가 " + product1.name +"보다 비쌉니다.");
}
}
}
// Comparable를 구현한 Product 클래스
class Product implements Comparable<Product>{
int price;
String name;
public Product(int price, String name) {
this.price = price;
this.name = name;
}
@Override
public int compareTo(Product o) {
return this.price - o.price;
}
}
매개변수로 들어오는 두 객체를 비교하는 것으로
compare(T o1, T o2)라는 메소드를 반드시 구현해야 한다.
✅ 밑에 코드를 보면서 Comparator 대해 알아보자
import java.util.Comparator;
public class Test{
public static void main(String[] args) {
Product product1 = new Product(10000,"반팔티");
Product product2 = new Product(20000,"맨투맨");
Product product3 = new Product(35000,"청바지");
// product2와 product3끼리 값을 비교한다.
int isExpensive = product1.compare(product2,product3);
if(isExpensive>0){
System.out.println(product2.name + "가 " + product3.name + "보다 더 비쌉니다.");
}else if(isExpensive==0){
System.out.println("두 제품 모두 가격이 같습니다.");
}else{
System.out.println(product3.name + "이 " + product2.name + "보다 더 비쌉니다.");
}
}
}
// Comparator을 구현하는 Product 클래스
class Product implements Comparator<Product> {
int price;
String name;
public Product(int price, String name) {
this.price = price;
this.name = name;
}
@Override
public int compare(Product o1, Product o2) {
return o1.price - o2.price;
}
}
자바에서 정렬을 사용하면 모두 오름차순(디폴트)을 기준으로 사용한다.
즉, 선행원소가 후행 원소보다 작다는 것을 기준으로 하는 것이다.
결과적으로 compare과 compareTo를 사용면, 음수일 경우에 위치를 바꾸지 않고 양수일 경우엔 위치를 바꾸며 정렬을 하는 것이다.
Arrays.sort()를 사용하면 바로 정렬이 가능하다. int[] arr = {1,3,2,5,4,6};
// 1. 배열 전체 오름차순 정렬하기
Arrays.sort(arr);
// 2. 배열의 일부분만 오름차순 정렬하기
// 이경우에는 2번째 부터 4번째 값까지 정렬을 수행한다.
Arrays.sort(arr,2,5);
✏️ Comparator 매개변수로 넘어온 c의 비교 기준을 가지고 매개변수로 넘어온 객체배열을 정렬하겠다는 의미이다.
Integer[] arr = {1,3,2,5,4,6};
// 1. compare 오버라이딩 해서 사용하기
// 이 때, 반드시 Wrapper Class를 이용해야 한다.
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
// 위의 내용을 람다 표현식을 이용해 작성하면 이런 방식으로 작성할 수 있다.
Arrays.sort(arr,(o1,o2)-> o2 - o1);
// 2. Collections.reverseOrder 사용하기
Arrays.sort(arr, Collections.reverseOrder());
// 3. Comparator.reverseOrder() 사용하기
Arrays.sort(arr, Comparator.reverseOrder());
List<Integer> list = new ArrayList<>(Arrays.asList(1,3,4,2,6,5));
// 1. Collections.sort()메소드 사용
Collections.sort(list);
// 2. list의 sort 메소드 사용
list.sort(Comparator.naturalOrder());
List<Integer> list = new ArrayList<>(Arrays.asList(1,3,4,2,6,5));
// 1. Collections.reverse()메소드를 사용
Collections.reverse(list);
// 2. list의 sort 사용
list.sort(Comparator.reverseOrder());
참고