람다식를 이용한 Arrays.sort 재정의한 정렬을 블로그 글을 참고하여 공부하던 도중, comparable과 compareTo와 차이에 대해 다시 공부할만한 좋은 글을 발견하여 해당 블로그를 참고하여 공부하고자 한다.
Comparable은 자기 자신과 매개변수 객체를 비교하는 것이고,Comparator는 두 매개변수 객체를 비교한다.
public class Person implements Comparable<Person> {
//person 객체와 다른 person 객체를 비교해야 되기 때문에 T 대신 Person
int age;
int month;
@Override
public int compareTo(Person o) {
return this.age - o.age;
}
//compareTo는 자기 자신과 대상 객체와의 차를 정수로 반환
Person (int age, int month){
this.age = age;
this.month = month;
}
public static void main(String[] args) {
Person p1 = new Person(10,3);
Person p2 = new Person(30,2);
int result = p1.compareTo(p2);
//p1(자기 자신)과 p2(다른 객체)를 비교
if(result>0){
System.out.println("p1이 더 크다.");
} else if (result==0) {
System.out.println("p1과 같다");
}else {
System.out.println("p2가 더 크다.");
}
}
}
자기 자신을 기준으로 상대방과의 차이 값을 비교하여 반환한다.정수로 반환한다.자기 자신과 비교 대상의 차>0 : 자기 자신이 더 큰 수이므로 정렬한다.자기 자신과 비교 대상의 차<0 : 자기 자신이 더 작은 수이므로 정렬하지 않는다.Comparable를 implements하는 구현체가 있어야 한다.익명객체를 생성하여 Comparator를 구현해야 한다.
자기 자신과 비교 대상의 차>0: 자기 자신이 더 큰 수이므로 다시 정렬한다.자기 자신과 비교 대상의 차<0: 자기 자신이 더 작은 수이므로 정렬하지 않는다.
두 값의 차>0이라면 이를 음수로 바꿔 반환해주고(정렬하기 위함), 만약 음수가 된다면 그 값을 양수로 바꾸어 반환해준다.(정렬하지 않음)// Comparable
public int compareTo(Object o) {
return o.value - this.value; // == -(this.value - o.value);
}
// Comparator
public int compare(Object o1, Object o2) {
return o2.value - o1.value; // == -(o1.value - o2.value);
}
String 클래스에 Comparable을 implements하여 compareTo() 메소드를 구현하고 있기 때문에 문자열 비교가 가능하다!참고
https://st-lab.tistory.com/243
https://st-lab.tistory.com/110#%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98