[JAVA]6. comparable과 comparator 그리고 compareTo()

쟈니·2023년 10월 22일
0

JAVA

목록 보기
6/8

시작하기에 앞서...🍀

람다식를 이용한 Arrays.sort 재정의한 정렬을 블로그 글을 참고하여 공부하던 도중, comparable과 compareTo와 차이에 대해 다시 공부할만한 좋은 글을 발견하여 해당 블로그를 참고하여 공부하고자 한다.

Comparable vs Comparator

Comparable자기 자신과 매개변수 객체를 비교하는 것이고, Comparator두 매개변수 객체를 비교한다.

Comparable

  • java.lang 패키지
    1. 자기 자신과 매개변수를 비교한다.
    2. compareTo 메소드를 반드시 구현해야한다.

예시 코드

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가 더 크다.");
        }
    }
}

Comparator

  • java.util 패키지
    1. compareTo는 정수를 반환하며, 자기 자신을 기준으로 상대방과의 차이 값을 비교하여 반환한다.

compareTo

  • compareTo는 자기 자신과 대상 객체와의 차를 정수로 반환한다.
  • 자기 자신과 비교 대상의 차>0 : 자기 자신이 더 큰 수이므로 정렬한다.
  • 자기 자신과 비교 대상의 차<0 : 자기 자신이 더 작은 수이므로 정렬하지 않는다.

Array.sort()

  • Array.sort(정렬대상, 정렬기준)
  • 정렬대상인 배열을 정렬기준으로 정렬한다.이 때 sort는 Merge sort를 포함하는데, Merge sort는 Comparator 매개변수 c로 c.compare을 호출하여 비교한다.
  • Comparable로 compareTo를 사용하여 비교도 가능하다.
  • Comparable로 비교하기 위해서는 Comparableimplements하는 구현체가 있어야 한다.
  • Comparator로 비교하기 위해서는 익명객체를 생성하여 Comparator를 구현해야 한다.

Array.sort()로 내림차순 정렬

  • 자기 자신과 비교 대상의 차>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 비교도 compareTo()

profile
시작은 미미하나 끝은 쥬쥬하다.

0개의 댓글