ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인터페이스를 사용하는 이유 (feat. Comparable)
    개발/Java 2020. 12. 18. 22:48
    보시는 분들께... 정확한 사실이 아니고 저의 고찰입니다.

    갑자기 이것이 궁금해진 이유

    우아한테크코스 프리코스를 진행하면서 Comparable 인터페이스를 사용한 적이 있다. 내가 이것을 제대로 알고 필요하다! 해서 사용한게 아니라, 검색을 하다보니 사용한 예제가 나와서 나도 모르게 외워서 사용한 것이다.
    코드를 짜고나서 보니 궁금한 점이 생겼다.

    내가 아는 인터페이스란.. 구현이 하나도 안되어 있는, 간단하게 말해서 이러한 기능을 사용할거다! 구현해라! 라고 알려주는 추상화같은게 아닌가?   
    어차피 구현도 안되어있고 구현해도 꼴랑 compareTo()를 오버라이드해서 `return a.value - b.value` 한 줄 작성하는게 전부인데, 그렇다면 비교를 위해서 굳이 Comparable 이라는 인터페이스를 구현하지 않고 내 마음대로 메소드만 정의해서 써도 되는거 아닌가?

    탐구 과정

    자바 docs를 참고하다가 다음 줄을 보고 깨달음을 얻었다!

    Lists (and arrays) of objects that implement this interface can be sorted automatically by Collections.sort (and Arrays.sort).
    Comparable을 구현하는 리스트나 배열의 객체는 Collections.sort에 의해 자동으로 정렬될 수 있다.


    그리고 위와 같이 구현 클래스들의 목록이 있었다.

     

    그러니까 아마 Collections.sort() 에도 Comparable 인터페이스의 compareTo() 메소드를 사용한다는 뜻이 아닐까?
    그럼 정렬을 수행할 때 각 객체에 구현된 compareTo()를 사용할 것이고, String이나 Integer들은 각각의 정렬의 기준을 가지고 있겠지만, Car같이 내가 정의한 클래스에 대해서는 어떻게 정렬할지 컴파일러 입장에서 알 방법이 없다. 그렇기 때문에 내가 Comparable를 구현해줘야 정렬의 기준을 알 수 있을 것이다.

     

    실제로 확인해보니 Integer는 다음과 같이 Comparable을 구현하고 있다!

    public static Integer decode(String nm) throws NumberFormatException {
        ...
        public int compareTo(Integer anotherInteger) {
                return compare(this.value, anotherInteger.value);
            }
        ...
    }

     

    결론

    자바에서 제공하는 인터페이스를 쓰는 이유는 이미 그 인터페이스를 이용해 구현된 클래스등이 있기때문이다. Comparable를 예를 들어 얘기하면, 이미 자바의 기본 클래스(Integer, String 등)은 인터페이스에 대해 구현이 되어있기 때문에 그 인터페이스를 사용해 구현한 클래스의 메소드를 자유롭게 사용할 수 있지만, 내가 새로운 클래스를 만들거나 했을 때는 비교할 기준이 없기 때문에 내가 새로 기준을 구현해줘야 하는 것이다.

     

    더 공부해볼 점

    생각해보니 우테코 프리코스 미션에서도 자동차 리스트에 있는 자동차 객체에 Comparable 인터페이스를 구현했다. 그리고 사용한 목적은 자동차들 중 어떤 필드 값이 가장 큰 자동차 객체를 찾기 위해 stream객체의 max() 메소드를 사용하기 위함이었다.

    엇 max()는 어떻게 정의되어 있나?
    Optional<T> max(Comparator<? super T> comparator);
    ?? Comparable이 아닌 Comparator다??.. 이 부분은 정확하게 모르겠지만, 대략적인 의미는 비교할 기준만 주면 된다는 것 같다.

    댓글

Designed by Tistory.