[Java/Collection] Comparable과 Comparator

최지수·2022년 5월 1일
0

Java

목록 보기
23/27
post-thumbnail

Collection Framework
데이터 군을 저장하는 클래스들을 표준화한 설계를 의미해요. 다수의 데이터 그룹들을 관리하는 표준화된 프로그래밍 방식을 말해요.

자바에선 다수의 데이터를 다루는데 필요한 다양하고 풍부한 클래스들을 제공하며, 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있기 때문에 재사용성이 높은 코드를 제공해요.

비슷하면서 의미가 조금 달라요

모든 프로그래밍에선 정렬 기능이 빠질 수가 없어요. 자바도 물론 Arrays 클래스에 sort라는 정렬 기능을 제공하는 클래스static 메서드가 존재해요. 이는 정수를 표하는 래퍼 클래스인 Integer부터, 문자열인 String등 다양한 클래스의 배열 또는 Collection 자료구조 클래스에 적용이 가능해요.

정렬이 가능한 클래스임을 알리는 Comparable

이 클래스들이 Arrays.sort를 통해 정렬이 가능한 것은 Comparable이라는 인터페이스를 상속 받기 때문에 가능한 것이에요. 실제로 래퍼 클래스 중 하나인 IntegerComparable 인터페이스를 상속해요.

그리고 Comparable 인터페이스는 내부적으로 정렬을 할 때 기본 기준을 정하는 compareTo라는 추상 메서드가 존재해요. 이를 통해 정상적으로 정렬 기능을 수행할 수 있는 거에요.

Comparator는 특정 타입에 새로운 정렬 기준을 제공해요.

기존 Comparable을 상속한 클래스, 심지어 Comparable을 상속하지 않는 클래스에도 새로운 정렬 기준을 제공할 수 있게 하는 인터페이스에요(타입은 해봤는데 안되요 ㅎㅎ). 정렬 메서드는 기본적으로 오름차순으로 데이터를 정렬해요. 그런데 만약 이를 내림차순으로 정렬하고 싶다면? 아니면 이름 데이터를 기준으로 정렬했었는데 갑자기 나이 순으로 정렬을 하고 싶다면? 그렇다고 기존 compareTo 메서드를 바꾸면 런타임 환경에서 이를 수정할 수가 없어요. 바로 이런 특정 클래스의 배열에 정렬 기준을 새로 부여할 때 사용하는 인터페이스라 생각하시면 되요.

Comparatorcompare(Object obj1, Object obj2) 추상 메서드를 가졌으므로 이를 상속하고 구현해서 사용하시면 되요. 그 밖에도 다른 메서드들이 존재하지만, 모든 default 메서드로 구현된 상태기 때문에 필요에 따라 오버라이딩하셔서 사용하시면 되요.

여기서 equals 메서드를 보시면 추상 메서드임에도 따로 구현할 필요가 없어요. 이는 모든 인터페이스와 클래스는 Object 클래스를 상속하고 Object 클래스 안에는 equals 메서드가 구현되어 있기 때문에 따로 구현할 필요가 없어요. 그저 Comparator 클래스는 오버라이딩이 필요할 수도 있다는 것을 알려주기 위해 존재하는 것이에요.

정리

Comparable : 클래스의 정렬 기능 가용과 기준을 정하는 인터페이스
Compartor : 클래스 정렬 시 새로운 기준을 정하는 인터페이스

기냥 마무리하기 그러니 Comparator를 상속한 클래스를 통해 내림차순 정렬 클래스 Compartor 구현 클래스를 첨부할게요~

String[] arrStr = { "cat", "Dog", "lion", "tiger" };
Arrays.sort(arrStr, new Descending<String>());
System.out.println("arrStr : " + Arrays.toString(arrStr));        

class Descending<T> implements Comparator<T> {
    @Override
    public int compare(Object obj1, Object obj2) {
        if(obj1 instanceof Comparable && obj2 instanceof Comparable){
            Comparable c1 = (Comparable)obj1;
            Comparable c2 = (Comparable)obj2;
            return -c1.compareTo(c2);
        }
        return -1;
    }
}
profile
#행복 #도전 #지속성

0개의 댓글