본문 바로가기

Tech/Java

[JAVA] Comparable과 Comparator

Comparator와 Comparable은 모두 인터페이스로 객체들을 정렬 또는 이진검색트리를 구성하는데 필요한 메서드를 정의하고 있음.

 

Comparable을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 없는 클래스들, 주로 Integer와 같은 wrapper클래스(Boolean제외)와 String, Date, File과 같은 것들이며 기본적으로 오름차순, 즉 작은 값에서부터 큰 값의 순으로 정렬되도록 구현되어 있음. 그래서 Comparable을 구현한 클래스는 정렬이 가능하다는 것을 의미함.

 

만일 Comparable을 구현하지 않은 클래스의 인스턴스를 TreeSet에 담는 다면 정렬기준이 없기 때문에 당연히 알아서 정렬되지 않을 뿐더러 컴파일 에러는 발생하지 않지만 실행 시 에러가 발생함.

Comparable

- 용도: 기본 정렬기준을 구현하는데 사용

- 패키지: java.lang

- 주요 메서드 : compareTo(Object o)

- 사용법 : Collectons.sort(memberList), Arrays.sort(memberList);

// age 기준으로 오름차순 정렬을 실시하고, age가 비교 대상과 동일한 경우 name 순으로 오름차순 정렬을 실시
class Member implements Comparable<Member> {
        private int age;
        private int name;

        @Override
        public int compareTo(Member o) {
            if (this.age > o.age) {
                return 1;
            } else if (this.age == o.age) {
                if (this.name > o.name) {
                    return 1;
                }
            }

            return -1;
        }
    }

    public static void main(String[] args) {
        List<Member> memberList = new ArrayList<>();
        ...
        Collections.sort(memberList);
    }

위 코드는 Comparable 인터페이스를 통해 Member라는 객체를 정렬하고자 할 때 적용할 기본 정렬 기준을 구현하고 있다.

 

Comparator

- 용도: 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용

- 패키지 : java.util

- 주요 메서드 : compare(Object o1, Object o2)

- 사용법 : Collections.sort(memberList, cutsomComporator), Arrays.sort(memberList, customComporator)

// name 기준으로 내림차순하는 정렬
static class CustomComparator implements Comparator<Member> {
        @Override
        public int compare(Member o1, Member o2) {
            if (o1.name > o2.name) {
                return -1;
            } else if (o1.name == o2.name) {
                return 0;
            } else {
                return 1;
            }
        }
    }

    public static void main(String[] args) {
        List<Member> memberList = new ArrayList<>();
        ...
        CustomComparator customComparator = new CustomComparator();
        Collections.sort(memberList, customComparator);
    }

위 코드는 Comprator 인터페이스를 통해 name 기준으로 내림차순하는 특별한 정렬 기준을 갖는 CustomComparator라는 객체를 생성한 뒤, sort()의 두 번째 파라미터로 Comparator를 전달하고 있다.

 

 

정렬 방법

[오름차순의 경우]

- 해당 객체 > 비교 객체 -> 1

- 해당 객체 < 비교 객체 -> -1

- 해당 객체 == 비교 객체 -> 0

 

[내림차순의 경우]

- 해당 객체 > 비교 객체 -> 1

- 해당 객체 < 비교 객체 -> -1

- 해당 객체 == 비교 객체 -> 0

 

 

결론

- Comparatable을 구현한 클래스들이 기본적으로 오름차순으로 정렬되어 있지만, 내림차순으로 정렬한다던가 아니면 다른 기준에 의해서 정렬되도록 하고 싶을 때 Comporator를 구현해서 정렬기준을 제공할 수 있음.

- 기본적인 정렬 기준은 Comparable로 구현하고, 특별히 다른 기준으로 정렬해야할 경우 Comparator객체를 만들어 그 때만 정렬 기준을 다르게 적용할 때 사용하면 유용하리라 예상됨.

 

 

 

 

[참고 자료]

- Java의 정석 Chapter 11. 컬렉션 프레임웍과 유용한 클래스 1.9 Comparator와 Comperable

- https://jeong-pro.tistory.com/173

- https://gmlwjd9405.github.io/2018/09/06/java-comparable-and-comparator.html

 

 

반응형