ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Comparable과 Comparator
    Programming/Java 2021. 4. 6. 10:04

    Comparable과 Comparator는 모두 Java의 인터페이스이다

    단어도 비슷하고, 인터페이스 내 메소드 내 구현해야 할 메소드 명도 비슷해서 항상 용법이 헷갈리지만 엄연히 역할들이 분류되어 있었다.

     

    Interface Comparable<T>

    Comparable은 java.lang package에 존재하는 public interface이며 이 인터페이스를 구현하는 클래스의 객체는 순서를 정의할 수 있는 규칙을 부여할 수 있다.

    Collections.sort(Arrays.sort)를 할 때 인자로 Comparator를 넘겨 주지 않아도 되며 sorted map이나 sorted set에서도 그 order가 적용된다.

        public class Point implements Comparable<Point> {
            int x;
            int y;
    
            @Override
            public int compareTo(Point o) {
          		return 1;
            }
        }

    Comparable은 미 구현 메소드인 int compareTo(T o)를 가지는데 Comparable을 구현하는 클래스는 해당 메소드를 구현해야 한다.

    compareTo는 기본적으로 natural order(숫자는 ascending, 문자는 lexical)의 값을 반환하는 것을 기준으로 설정되어 있다

            @Override
            public int compareTo(Point o) {
                //ascending
                return x - o.x;
                //desending
                return o.x - x;
            }

    즉, return 값의 범위에 따라 현재 객체와 비교 객체의 순서가 결정된다(nagative면 ascending, positive면 descending)

    일반적인 primitive type인 int, long 등으로 비교할 경우 위의 예제처럼 minus 연산을 해줄 수 있지만, Wrapper Class를 이용한 비교 및 반환도 가능하다.

            @Override
            public int compareTo(Point o) {
                return Integer.compare(x, o.x);
                //same to return x - o.x
            }

    개인적으로는 -연산 시 underflow 발생 가능성이 존재하기 때문에 compare 연산자를 써주는 것이 좋다고 생각한다

     

     

    Interface Comparator<T>

    Comparator는 java.util package에 존재하는 public interface이며 객체 Collection에 순서를 부여하는 비교 메소드를 정의하는 인터페이스이다.

    Comparator를 implements 하는 클래스는 compare 메소드를 구현할 의무를 가지며 Comparable과는 달리 내부에 여러 메소드가 존재한다(reverse, thenComparingInt, thenComparing, thenComparingInt 등).

            Collections.sort(list, new Comparator<Point>() {
                @Override
                public int compare(Point o1, Point o2) {
                    return o1.x - o2.x;
                }
            });

    주로 Collections.sort의 두 번째 인자에 넣기 위해 사용한다.

    Comparable은 이미 정의된 객체에 order를 부여해줘서 주체가 객체고 그것을 보조해주는 느낌이라면 Comparator는 Compare method가 주체라고 느꼈다.

    order를 정의하는 내부 메소드의 이름은 compare이며 동작은 Comparable의 compareTo와 동일하다.

    Collections.sort(list, (o1, o2) -> o1.x - o2.x);

    때때로 위의 식과 같이 람다 함수로 변형되어 사용되기도 한다.

     

    출처: https://blog.kakaocdn.net/dn/cgF6ab/btqV35l4R65/la1KKAt08qtGgaTk8j1hpk/img.jpg

     

    출처:

    docs.oracle.com/javase/8/docs/api/java/util/Comparator.html

    docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html

Designed by Tistory.