먼저, 둘의 공통점은 비교 기능에 대한 것이라는 점이다.
둘의 차이를 한마디로 정의하자면,
기본 기준(Comparable)과 추가 기준(Comparator)의 차이다.
서브웨이 메뉴판으로 예시를 들어보자.
기본적으로 사장님이 별도로 정하지 않는다면(귀차니즘) 가나다 순 정렬이 본사의 정책이라고 가정하자.
기본 정책 적용 방법 : 객체에 Comparable 인터페이스 구현.
public class Sandwich implements Comparable<Sandwich> {
private String name;
private int rank;
public Sandwich(String name, int rank) {
this.name = name;
this.rank = rank;
}
public String getName() {
return name;
}
public int getRank() {
return rank;
}
@Override
public int compareTo(Sandwich o) {
return o.getName().compareTo(this.getName());
}
@Override
public String toString() {
return "Sandwich{" +
"name='" + name + '\'' +
", rank=" + rank +
'}';
}
}
사장님 마다 메뉴 만들기를 다르게 할 수 있다고 가정하자.
나라면 베스트 메뉴를 제일 위에 걸겠다.
=> 만들어둔 개인용 Comparator를 정렬 시에 파라미터로 넘겨준다. => 커스텀.
public class RankComparator implements Comparator<Sandwich> {
@Override
public int compare(Sandwich o1, Sandwich o2) {
return Integer.compare(o1.getRank(), o2.getRank());
}
}
import java.util.Arrays;
public class Subway {
public static void main(String[] args) {
Sandwich eggMayo = new Sandwich("eggMayo", 5);
Sandwich blt = new Sandwich("B.L.T", 1);
Sandwich chicken = new Sandwich("chicken", 7);
Sandwich[] menu = {eggMayo, blt, chicken};
Arrays.sort(menu);
System.out.println("기본 Comparable 정렬 : " + Arrays.toString(menu));
Arrays.sort(menu, new RankComparator());
System.out.println("커스텀 Comparator 정렬 : " + Arrays.toString(menu));
}
}
실행 결과 :
기본 Comparable 정렬 : [Sandwich{name='eggMayo', rank=5}, Sandwich{name='chicken', rank=7}, Sandwich{name='B.L.T', rank=1}]
커스텀 Comparator 정렬 : [Sandwich{name='B.L.T', rank=1}, Sandwich{name='eggMayo', rank=5}, Sandwich{name='chicken', rank=7}]'Language > Java' 카테고리의 다른 글
| [Java 기본] Object Class (0) | 2024.10.29 |
|---|---|
| OCP 원칙이란? (0) | 2024.06.25 |
| [Java] 동시성 문제, 쓰레드 로컬 ThreadLocal (1) | 2023.11.30 |
| Java 필수 - 멀티쓰레드와 동기화 (feat. Atomic, Synchronized, Volatile) (0) | 2023.07.03 |
| Java 기본 - Wrapper Class 래퍼 클래스 (0) | 2023.06.30 |