둘 다 "객체를 특정 기준으로 비교할 수 있도록 한다."
Comparable
- Comparable 인터페이스를 쓰려면 compareTo(T o) 구현
- 자기 자신과 매개변수 (T클래스 자료형 o) 객체를 비교
- lang패키지에 있어 import 필요 x
Comparator
- Comparator 인터페이스를 쓰려면 compare(T o1, T o2) 구현
- 두 매개변수 객체를 비교
- util패키지에 있어 import 필요
- Comparator 인터페이스를 구현하는 클래스는 비교하는 두 객체와 아무 관련이 없고,
compare()만 overriding해서 비교할 때만 사용하려고 하는 것이다.
그래서 Comparator을 구현하는 익명 객체를 생성하여 주로 사용한다.
- Comparator을 구현하는 익명 객체를 여러 개 생성하여 사용하면
각각 다른 여러 기준으로 비교할 수 있다.
정렬
배열 정렬 메소드(Arrays.sort(), Collections.sort() 등)에서 해당 Interface를 사용한다.
Arrays.sort(배열)일 경우는 Comparable인터페이스를 구현한 클래스에서 overring한 compareTo() 기준으로,
Arrays.sort(배열, Comparator)일 경우는 Comparator 인터페이스를 구현한 클래스에서 overriding한 compare(o1, o2)의 기준으로 배열을 정렬한다.
배열의 요소가 수, 문자, 문자열 같은 경우 각 자료형이 Comparable을 상속받고 있고,
overriding한 compareTo()에 일반적인 비교 기준이 구현되어 있다.
따라서 Arrays.sort(int형 배열), Arrays.sort(String형 배열)을 하면 일반적인 오름차순으로 배열이 정렬된다.
public class Soldier implements Comparable<Soldier> {
String name;
int age;
int height;
public Soldier(String name, int age, int height) {
this.name = name;
this.age = age;
this.height = height;
}
@Override
public int compareTo(Soldier o) {
//기본적으로 정렬할 기준
//이름 가나다 순 정렬
return this.name.compareTo(o.name); //String형이 overriding한 compareTo()
}
@Override
public String toString() {
// 출력을 위한 overriding
return "이름 : "+this.name+" / 나이 : "+this.age+" / 키 : "+this.height;
}
}
import java.util.Arrays;
import java.util.Comparator;
public class ArraySortTest {
private static Soldier[] soldiers;
public static void main(String[] args) {
soldiers = new Soldier[6];
soldiers[0] = new Soldier("김민수", 20, 172);
soldiers[1] = new Soldier("박철민", 18, 183);
soldiers[2] = new Soldier("최공자", 21, 178);
soldiers[3] = new Soldier("이준기", 19, 175);
soldiers[4] = new Soldier("박정식", 24, 169);
soldiers[5] = new Soldier("최빈이", 23, 188);
System.out.println("정렬 전");
System.out.println("---------------");
for(Soldier soldier : soldiers) {
System.out.println(soldier);
}
System.out.println();
System.out.println("이름 순 정렬");
System.out.println("---------------");
//Soldier클래스에서 overriding한 compareTo()에 의해 정렬
Arrays.sort(soldiers);
for(Soldier soldier : soldiers) {
System.out.println(soldier);
}
System.out.println();
System.out.println("나이 순 정렬");
System.out.println("---------------");
//comp1을 기준으로 하여(나이) 배열 정렬
Arrays.sort(soldiers, comp1);
for(Soldier soldier : soldiers) {
System.out.println(soldier);
}
System.out.println();
System.out.println("키 순 정렬");
System.out.println("---------------");
//comp1을 기준으로 하여(나이) 배열 정렬
Arrays.sort(soldiers, comp2);
for(Soldier soldier : soldiers) {
System.out.println(soldier);
}
System.out.println();
}//main() end
//나이 순 정렬을 위한 Comparator구현 익명 객체
static Comparator<Soldier> comp1 = new Comparator<Soldier>() {
@Override
public int compare(Soldier soldier1, Soldier soldier2) {
// 나이 순 정렬
return soldier1.age - soldier2.age;
}
};
//키 순 정렬을 위한 Comparator구현 익명 객체
static Comparator<Soldier> comp2 = new Comparator<Soldier>() {
@Override
public int compare(Soldier soldier1, Soldier soldier2) {
//키 순 정렬
return soldier1.height - soldier2.height;
}
};
}
정렬 전
---------------
이름 : 김민수 / 나이 : 20 / 키 : 172
이름 : 박철민 / 나이 : 18 / 키 : 183
이름 : 최공자 / 나이 : 21 / 키 : 178
이름 : 이준기 / 나이 : 19 / 키 : 175
이름 : 박정식 / 나이 : 24 / 키 : 169
이름 : 최빈이 / 나이 : 23 / 키 : 188
이름 순 정렬
---------------
이름 : 김민수 / 나이 : 20 / 키 : 172
이름 : 박정식 / 나이 : 24 / 키 : 169
이름 : 박철민 / 나이 : 18 / 키 : 183
이름 : 이준기 / 나이 : 19 / 키 : 175
이름 : 최공자 / 나이 : 21 / 키 : 178
이름 : 최빈이 / 나이 : 23 / 키 : 188
나이 순 정렬
---------------
이름 : 박철민 / 나이 : 18 / 키 : 183
이름 : 이준기 / 나이 : 19 / 키 : 175
이름 : 김민수 / 나이 : 20 / 키 : 172
이름 : 최공자 / 나이 : 21 / 키 : 178
이름 : 최빈이 / 나이 : 23 / 키 : 188
이름 : 박정식 / 나이 : 24 / 키 : 169
키 순 정렬
---------------
이름 : 박정식 / 나이 : 24 / 키 : 169
이름 : 김민수 / 나이 : 20 / 키 : 172
이름 : 이준기 / 나이 : 19 / 키 : 175
이름 : 최공자 / 나이 : 21 / 키 : 178
이름 : 박철민 / 나이 : 18 / 키 : 183
이름 : 최빈이 / 나이 : 23 / 키 : 188
위 글은 아래 출처를 참고하여 작성하였습니다.
출처 : https://st-lab.tistory.com/243
댓글