자바 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 클래스 그밖에 객체를 비교하는데 사용할 수 있습니다.
참고문서
Comparable Interface in Java with example (beginnersbook.com)
Java Comparable interface example – HowToDoInJava
Comparator and Comparable in Java | Baeldung