728x90
공통점
둘 다 객체를 비교하는 기능을 가지는 인터페이스라는 점에서 동일합니다.
Comparable
// Comparable<T> 인터페이스 구현, int compareTo(T t1, T t2) 메서드 오버라이드 필요
class Item implements Comparable<Item> {
int value;
@Override
public int compareTo(Item i2) {
return value - i2.value;
}
}
Comparator
// Comparator<T> 인터페이스 구현, int compare(T t) 메서드 오버라이드 필요
class Item implements Comparator<Item> {
int value;
@Override
public int compare(Item i1, Item i2) {
return i1.value - i2.value; // 선행되는 값이 더 크면 1이 반환되게 함으로써 오름차순 정렬에 활용 가능
}
}
차이점
Comparable
을 구현한 클래스의 인스턴스는compareTo()
메서드를 이용해 비교할 대상을 인자로 받고,Comparator
을 구현한 클래스의 인스턴스는compare()
메서드를 이용해 비교할 값들을 인자로 받습니다. 여기에서 매개변수의 수가 다르다는 차이점이 생깁니다.Comparable
는 java.lang 패키지에 속하는 클래스로 별도의 import가 필요하지 않습니다. 반면에Comparator
는 java.util` 패키지에 속하는 클래스로 import가 이루어져야 사용 가능합니다.
Comparable
class Item implements Comparable<Item> {
// 생략
}
class ComparableExample {
public static void main(String[] args) {
Item item = new Item();
item.value = 2;
Item target = new Item();
target.value = 4;
int compareResult = item.compareTo(target);
}
}
Comparator
class Item implements Comparator<Item> {
// 생략
}
class ComparatorExample {
public static void main(String[] args) {
Item item = new Item();
item.value = 2;
Item target = new Item();
target.value = 4;
int compareResult = item.compareTo(item.value, target.value);
}
}
임시
Comparator
의 경우에는 자신의 값을 비교할 때에도 새로운 객체를 생성해야 한다는 점이 의아하다. 이런 경우에는 불필요한 필드들도 함께 생성된다. 이를 피하기 위해서 Comparator
를 이용해 비교할 객체를 Comparator
를 구현하게 하지 말고, Comparator
를 익명 객체로 만들어 이를 도구삼아 비교하는 방법을 이용할 수 있다.
class Item {
// 생략
}
class ComparatorExample {
public static void main(String[] args) {
Item item = new Item();
item.value = 2;
Item target = new Item();
target.value = 4;
Comparator<Item> comparator = new Comparator<>() {
@Override
public int compare(Item o1, Item o2) {
return o1.value - o2.value;
}
}
int compareResult = comparator.compareTo(item.value, target.value);
}
}
반응형
'Backend > Java' 카테고리의 다른 글
(메모) Map -> Set -> Iterator 변환하기 (0) | 2024.07.24 |
---|---|
Java 소스 코드의 동작 원리(JVM은 어떻게 동작할까? 메모리와 GC) (0) | 2024.04.08 |
Java) 어노테이션(Annotation)이란? (0) | 2022.12.26 |
Java8) Annotation 변경 사항(타입 선언부에 사용, @Repeatable) (0) | 2022.12.26 |
Java8) Java 비동기 프로그래밍과 CompletableFuture (0) | 2022.10.31 |