자바 Comparable 인터페이스 | 자바 입문강좌 48

자바 Comparable 인터페이스

Comparable 인터페이스는 콜렉션 프레임워크에서 비교와 정렬에 사용됩니다. 자료구조에 따라 사용법이 약간씩 차이가 있으므로 사용하려는 자료구조에 적합한지 테스트 한 후 사용합니다.

아래의 소스 코드는 ArrayList 로 Comparable 인터페이스로 정렬하는 예제입니다.

클래스 MyMemo 에 Comparable 인터페이스를 구현합니다. 인터페이스를 구현하면 오버라이드를 꼭 해줘야 합니다. 어떤 메소드를 오버라이드 해야할 지 찾는 것도 일입니다만, 인텔리제이를 사용하면 자동으로 오버라이드 코드를 생성하는 코드가 있습니다. 아마 이클립스에도 인터페이스의 코드를 추가하는 기능이 있을 겁니다. IDE 의 자동 코드 생성 기능을 자주 사용해주는 것이 코딩을 좀 더 빠르고 효율적으로 할 수 있게 도와줍니다.

package com.kay;


import java.util.ArrayList;
import java.util.Collections;

public class Main {
    public static void main(String[] args) {

        ArrayList<MyMemo> mem1 = new ArrayList<>();

        mem1.add(new MyMemo(101, "Hello World!"));
        mem1.add(new MyMemo(201, "Comparing string length"));
        mem1.add(new MyMemo(301, "short text"));
        mem1.add(new MyMemo(401, "long ang long text"));
        mem1.add(new MyMemo(501, "just text"));
        mem1.add(new MyMemo(601, "meaning what?"));
        mem1.add(new MyMemo(701, "a word"));

        System.out.println("[----------- No Sorting -----------]");

        for (MyMemo m : mem1){
            m.showMemo();
        }

        System.out.println("[----------- After sorting by String length -----------]");

        Collections.sort(mem1);

        for (MyMemo m : mem1){
            m.showMemo();
        }

    }
}
class MyMemo implements Comparable<MyMemo>{
    private int memoId;
    private String memoText;

    public MyMemo(int memoId, String memoText) {
        this.memoId = memoId;
        this.memoText = memoText;
    }
    public void showMemo(){
//        System.out.print("[instance] = " + this.toString() + ", ");
        System.out.print("[Id] " + memoId + ", ");
        System.out.print("[Text] \'" + memoText + "\'");
        System.out.println();
    }

    @Override
    public int compareTo(MyMemo o) {
        return this.memoText.length() - o.memoText.length();
    }
}
[----------- No Sorting -----------]
[Id] 101, [Text] 'Hello World!'
[Id] 201, [Text] 'Comparing string length'
[Id] 301, [Text] 'short text'
[Id] 401, [Text] 'long ang long text'
[Id] 501, [Text] 'just text'
[Id] 601, [Text] 'meaning what?'
[Id] 701, [Text] 'a word'
[----------- After sorting by String length -----------]
[Id] 701, [Text] 'a word'
[Id] 501, [Text] 'just text'
[Id] 301, [Text] 'short text'
[Id] 101, [Text] 'Hello World!'
[Id] 601, [Text] 'meaning what?'
[Id] 401, [Text] 'long ang long text'
[Id] 201, [Text] 'Comparing string length'

compareTo 메소드의 오버라이드를 보면 문자열간에 뺄셈을 하여 문자열 수로 오름차순 비교를 하고 있습니다. 정렬을 실행하는 것은 main 함수에서 Collections.sort()로 할 수 있습니다. sort 메소드를 사용하는 기준으로 compareTo 메소드를 사용합니다.

After Sorting by String Length 를 보면 문자열 수가 적은 쪽에서 많은 쪽으로 오름차순 정렬하여 출력합니다.

Comparator 인터페이스

Comparable 인터페이스와 Comparator 인터페이스는 같은 비교기능을 수행합니다. 차이점은 오버라이드 메소드 compare에서 매개변수로 두개의 객체를 받는 다는 것입니다. TreeSet 을 사용하면 Comparator 를 기준으로 요소들을 오름차순 정렬합니다.

package com.kay;

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Set<MyMemo> arrayList = new TreeSet<>(new MyMemo());

        arrayList.add(new MyMemo(1001, "Comparator"));
        arrayList.add(new MyMemo(1002, "text"));
        arrayList.add(new MyMemo(1003, "two words"));
        arrayList.add(new MyMemo(1004, "sorting"));
        arrayList.add(new MyMemo(1005, "text length"));
        arrayList.add(new MyMemo(1006, "comparing"));
        arrayList.add(new MyMemo(1007, "Compare"));

        for (MyMemo m1 : arrayList){
            m1.showMemo();
        }
        
    }
}
class MyMemo implements Comparator<MyMemo> {
    private int memoId;
    private String memoText;

    public MyMemo(){
        this.memoId = 0;
        this.memoText = null;
    }

    public MyMemo(int memoId, String memoText) {
        this.memoId = memoId;
        this.memoText = memoText;
    }
    public void showMemo(){
//        System.out.print("[instance] = " + this.toString() + ", ");
        System.out.print("[Id] " + memoId + ", ");
        System.out.print("[Text] \'" + memoText + "\'");
        System.out.println();
    }

    @Override
    public int compare(MyMemo o1, MyMemo o2) {
        return o1.memoText.length() - o2.memoText.length();
    }
}
[Id] 1002, [Text] 'text'
[Id] 1004, [Text] 'sorting'
[Id] 1003, [Text] 'two words'
[Id] 1001, [Text] 'Comparator'
[Id] 1005, [Text] 'text length'

요약

두개의 객체를 비교하는 자바 Comparable 인터페이스와 Comparator 인터페이스를 알아봤습니다.

ArrayList 나 TreeSet 등의 컬렉션 프레임워크의 자료구조와 함께 String, Wrapper 클래스 그밖에 객체를 비교하는데 사용할 수 있습니다.

참고문서

Java Comparable – javatpoint

Comparable Interface in Java with example (beginnersbook.com)

Java Comparable interface example – HowToDoInJava

Comparator and Comparable in Java | Baeldung

Leave a Comment