항상 Comparable과 Comparator를 생각 없이 사용하다가 과제를 제출하는데 Comparator는 에러가 발생하고 Comparable은 정상작동하는 상황이 생겨 두 인터페이스의 차이에 대해 알아봤습니다.
Comparable은 인자 1개 받고 this과 객체1을 비교하고 Comparator는 인자를 2개 받아서 객체1과 객체2를 비교합니다.
@Override
public int compareTo(Point o) {
double angle1 = calAngle(startPoint, this);
double angle2 = calAngle(startPoint, o);
if (angle1 < angle2) return -1;
else if (angle1 > angle2) return 1;
else return dist(this,o);
}
//객체 내부에 선언한 예시
@Override
public int compare(Point o1, Point o2) {
double angle1 = calAngle(startPoint, o1);
double angle2 = calAngle(startPoint,o2);
if(angle1<angle2) return -1;
else if(angle1>angle2) return 1;
else return 0;
}
// 객체 외부에 선언한 예시
// 객체 외부에 선언해도 Comparator<객체>를 선언하면 매핑이 가능한 것 같습니다.
public class PersonAgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return Integer.compare(p1.getAge(), p2.getAge());
}
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("John", 25));
people.add(new P.....
알고 보니 CompareTo와 Compare라는 차이를 디테일하게 줬네요.
객체를 Person으로 예를 들자면
Comparable은 대상 객체인 Person의 필드 속성만을 비교대상으로 합니다.
반면에 Comparator는 외부에 비교 로직을 선언할 수 있게 하여 Person 필드 뿐만 아니라 외부의 속성까지 비교대상으로 할 수 있습니다.