/ JAVAJUNGSUK

Ch11-30~33. Comparable

자바의 정석 기초편

0. 목차



Chapter11. 컬렉션 프레임웍

Ch11 - 30. Comparator와 Comparable

Ch11 - 31. Comparator와 Comparable 예제

Ch11 - 32. Integer와 Comparable

Ch11 - 33. Integer와 Comparable 예제



Ch11 - 30. Comparator와 Comparable


▶ Comparator와 Comparable이란?

▷ 객체 정렬에 필요한 메서드를 정의한 인터페이스
▷ 메서드 : 정렬 기준 제공을 목적으로 함
▷ 정렬 = sort() = 두 대상 비교 후, 자리 바꿈
▷ 정렬 기준 : 오름차순, 내림차순…
▷ 컴퓨터가 스스로 정렬 기준 찾지 못함
▷ 컴퓨터가 정렬 기준대로 정렬하도록 할 때 사용하는 인터페이스


▶ Comparator란?

▷ 기본 정렬 기준을 구현
▷ default 정렬 기준
  • Comparator code
      public interface Comparator {
          int compare(Object o1, Object o2); // o1 vs o2
          boolean equals(Object obj); // equals를 오버라이딩 하라는 뜻
      }
    


▶ Comparable이란?

▷ 기본 정렬 기준 외 다른 기준으로 정렬하고자 할 때
  • Comparable code
    public interface Comparable {
        int compareTo(Object o); // 주어진 객체(o) vs 자신(this)
    }
    

compare() & compareTo()

▷ 반환
  • a > b : +
  • a = b : 0
  • a < b : -
compare()compareTo()는 두 객체의 비교 결과를 반환하도록 작성
public final class Integer extends Number implements Comparable {
  ...
  public in t compareTo(Integer anotherInteger) {
    int v1 = this.value;
    int v2 = anotherInteger.value;
    
    return (v1 < v2 ? -1 : (v1 == v2? 0 : 1));
  }
}
compare()compareTo()의 반환 결과에 따라 자리 바꿈 결정
  • 오름차순↗ : 5 7 비교
    int v1 = 5;
    int v2 = 7;
      
    int compare(v1, v2);
    
    5 < 7
    -
      
    - : 자리 바꿈 필요X(5 ↗ 7) 
    
  • 내림차순↘ : 5 7 비교
    int v1 = 5;
    int v2 = 7;
      
    int compare(v1, v2);
    
    5 < 7
    -
      
    - : 자리 바꿈 필요(5 ↘ 7) 
    



Ch11 - 31. Comparator와 Comparable 예제


▶ sort(String[])

String[] strArr = {"cat", "Dog", "lion", "tiger"};
▷ strArr 정렬 기준 생략
▷ strArr = String[]
▷ Arrays.sort(strArr, 정렬 기준 없음); → 기본 정렬 기준 적용
  • 정렬 대상 : strArr
  • 정렬 기준 : String의 Comparable에 의한 정렬
    class String implements Comparable { // 기본 정렬 기준, String은 사전순 - ABC
      ...
      int compareTo(); // Comparable 안에 compareTo 있음
      ...
    }
    
    Arrays.sort(strArr);
      
    // console
    strArr = [Dog, cat, lion, tiger]
    


▶ sort(String[], 정렬 기준)

String[] strArr = {"cat", "Dog", "lion", "tiger"};
▷ strArr 정렬 기준대로 정렬
▷ Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER);
  • 정렬 대상 : strArr
  • 정렬 기준 : String.CASE_INSENSITIVE_ORDER
    public static final Comparator<String> CASE_INSENSITIVE_ORDER
                                           = new CaseInsensitiveComparator();
    
    Arrays.sort(strArr, String.CASE_INSENSITIVE_ORDER); // 대소문자 구분X
      
    // console
    strArr = [cat, Dog, lion, tiger]
    


▶ sort(String[], 정렬 기준)

String[] strArr = {"cat", "Dog", "lion", "tiger"};
▷ strArr 정렬 기준대로 정렬
▷ Arrays.sort(strArr, new Descending());
  • 정렬 대상 : strArr
  • 정렬 기준 : Descending()
    class Descending implements Comparator { 
      public int compare(Object o1, Object o2) {
        if( o1 instanceof Comparable && o2 instanceof Comparable) {
          Comparable c1 = (Comparable)o1;
          Comparable c2 = (Comparable)o2;
          return c1.compareTo(c2) * -1 ; // '0', '+', '-'로 반환 → × -1 역으로 변경, c2.compareTo(c1)와 같이 순서를 바꿔도 같은 결과
          }
          return -1;
        } 
    }
    
    Arrays.sort(strArr, new Descending()); // 역순 정렬
    
    // console
    strArr = [tiger, lion, cat, Dog]  
    



Ch11 - 32. Integer와 Comparable


▶ Integer implements Comparable

▷ Integer, String, Float… 끼리 비교 가능
▷ Integer, String, Float… 이런 클래스들은 implements Comparable 이라서
public final class Integer extends Number implements Comparable { // Comparable은 기본 정렬 기준 제공, default
  ...
  public int compareTo(Object o) {
    return compareTo((Integer) o);
  }

  public int compareTo(Integer anotherInteger) {
    int thisVal = this.value;
    int anotherVal = anotherInteger.value;

    return (thisVal < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
  }
  ...
}



Ch11 - 33. Integer와 Comparable 예제


▶ 버블 정렬

▷ int[], 오름차순 정렬
static void sort(int[] intArr) {
  for (int i = 0; i < intArr.length - 1; i++) {
    for (int j = 0; j < intArr.length - 1 - i; j++) {
      int tmp = 0; 
      // ① 두 대상 비교 : 불변
      
      if (intArr[j] > intArr[j + 1]) { // 정렬 기준 : 가변
        tmp = intArr[j];
        intArr[j] = intArr[j + 1];
        intArr[j + 1] = tmp;
      // ② 자리 바꿈 : 불변        
      }
    }
  }
}
▷ Object[], Comparator
static void sort(Object[] objArr, Comparator c) {
  for (int i = 0; i < objArr.length - 1; i++) {
    for (int j = 0; j < objArr.length - 1 - i; j++) {
      int tmp = null; 
      // ① 두 대상 비교 : 불변
      
      if (c.compare(objArr[j], objArr[j + 1] > 0) { // 정렬 기준 : 가변
        tmp = objArr[j];
        objArr[j] = objArr[j + 1];
        objArr[j + 1] = tmp;
      // ② 자리 바꿈 : 불변        
      }
    }
  }
}