ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바[JAVA] - Comparable과 Comparator의 이해
    Java/자바의정석 2023. 2. 28. 15:02
    반응형

    Comparable과 Comparator에 대해 알아보자

     

    Comparable과 Comparator의 기본 개념

    모두 인터페이스(Interface)로 구현되어있다.
    즉, 사용하고자한다면 인터페이스 내에 선언된 메소드를 반드시 구현해야한다는 의미이다.
    객체 비교를 하기위해 사용된다.

     

    Comparable은 무엇인가?

    Comparable : 자기자신과 매개변수를 비교하는 것

     

    우선 기본개념만 알고 자세히 알기위해 아래의 코드를 살펴보자.

    public class compareTest {
        public static void main(String[] args) {
    
            int a = 1;
            int b = 2;
    
            if(a > b) {
                System.out.println("a가 b보다 큽니다.");
            }else if(a == b){
                System.out.println("a와 b가 동일합니다.");
            }else{
                System.out.println("a가 b보다 작습니다.");
            }
        }
    }

    비교를 위해 사용이 되지만 왜 굳이 Comparable 을 사용하는가? 이와같이 연산자를 사용하여 비교하면 편할거라 생각한다. 

    Person p1 = new Person(170, 70);
    Person p2 = new Person(180, 80);

    하지만 이와같이 Height,와 Weight로 구성되어있는 Person객체가 있다고 한다면 무엇을 기준으로 비교를 해야하는가?

    체급으로 비교를하는지 신체로 비교를하는지 알수가없다. 이럴때 Comparable을 사용한다.

    우선 Comparable이 어떻게 구성되어있는지부터 살펴보자.

    public interface Comparable<T> {
        public int compareTo(T o);
    }

    해당 인터페이스는 이와같이 구성되어있다.

     

    class Person implements Comparable<Person>{
        int weight;
        int height;
    
        Person(int weight, int height){
            this.weight = weight;
            this.height = height;
        }
    
        @Override
        public int compareTo(Person o) {
            // 만약 자신의 weight가 o의 weight보다 크다면 양수가 반환 될 것이고,
            // 같다면 0을, 작다면 음수를 반환할 것이다.
            return this.weight - o.weight;
        }
    }

     

    해당 제네릭스에 우리가 비교할 Person을 대입해준다. 그리고 기존에 Comparable은 자기자신을 기준으로 삼아 매개변수를 비교한다고 개념을 잡았다. 보통 -1,0,1 을 반환하는것이 일반적이지만 더 큰 폭으로 설명하자면 양수, 음수 혹은 0을 반환하는것이다. 여기서는 자기자신과 매개변수의 차이를 반환하도록 설정해두었다.

    Person p1 = new Person(170, 70);
    Person p2 = new Person(180, 80);
    
    int big = p1.compareTo(p2);
    
    System.out.println("big==>" + big);
    
    if(big > 0){
        System.out.println("p1객체가 p2객체의 체급보다 높습니다..");
    }else if(big == 0){
        System.out.println("p1객체와 p2객체의 체급은는 같습니다.");
    }else {
        System.out.println("p1객체가 p2객체의 체급보다 낮습니다..");
    }

    main에서 이와같이 같이 구성이 가능하다.

     

     p1.compareTo(p2);

    이와같이 p1(객체자신) 을 compareTo를 이용하여 p2(매개변수)와 비교를 하고있다.

     

    Comparable 정리

    자기 자신과 매개변수를 비교한다.
    Comprable은 compareTo 메소드를 반드시 구현해야한다.

     

     


    Comparator은 무엇인가?

    두 매개변를 비교한다.
    즉 자기 자신이 아니라 파라미터(매개 변수)로 들어오는 두 객체를 비교하는 것

     

    @FunctionalInterface
    public interface Comparator<T> {
        int compare(T o1, T o2);

    Comparator는 위와같이 구성되어있다. 파라미터 두개의 값을 받아 두개의 객체를 비교하도록 구성되어있다.

    이 때, 필수적으로 구현해야하는 compare() 메소드가 바로 객체를 비교할 기준을 정의해주는 부분이다.

     

    class Person implements Comparator<Person>{
    
        int weight;
        int height;
    
        Person(int weight, int height){
            this.weight = weight;
            this.height = height;
        }
    
        @Override
        public int compare(Person p1, Person p2) {
            return p1.height - p2.height;
        }
    }

    Comparator를 사용하기위해 인터페이스 상속을 받은 뒤에 비교기준을 세워줄 compare 메서드를 재정의하였다.

     

     

    public class compareTest {
        public static void main(String[] args) {
    
            Person p1 = new Person(170, 70);
            Person p2 = new Person(175, 85);
            Person p3 = new Person(190, 90);
    
            int big = p1.compare(p2, p3);
            System.out.println(big);
    
    
        }
    }

    이와같이 p1,p2,p3인스턴스를 생성한뒤 첫번째에

    int big = p1.compare(p2, p3);
    System.out.println(big);

    해당 코드를 실행한다면 p2.height - p3.height = -5값이 출력되어나온다.

    Comparator는 자기자신이 아닌 매개변수의 값들을 비교하는것이다.

     

     

    Comparator 정리

    매개변수의 값들을 비교한다.
    Comparator는 compare 메서드를 반드시 구현해야한다.
    반응형

    댓글

Designed by Tistory.