객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스
정렬 : sort(). 두 대상을 비교한 후, 자리를 바꿈. 이를 반복함. -> 어떤 정렬 방식이든 이 원리는 동일함. (불변)
하지만, 정렬 기준은 매번 달라질 수 있음. (가변) -> 변하는 부분만 정렬 방식에 기준으로써 제공.
// ex. 버블 정렬
// int[] intArr = {5, 3, 4, 0, 1, 2};
static void sort(int[] intArr) {
for (int i = 0; i < intArr.length - 1; i++) {
for (int j = 0; j < intArr.length - 1; j++) {
int tmp = 0;
if (intArr[j] > intArr[j + 1]) { // 비교 기준. 정렬 기준만 가변적임.
tmp = intArr[j];
intArr[j] = intArr[j + 1];
intArr[j + 1] = tmp;
}
}
}
}
// 정렬대상 정렬기준
static void sort(Object[] objArr, Comparator c) {
for (int i = 0; i < objArr.length - 1; i++){
for (int j = 0; j <objArr.length - 1; j++) {
Object tmp = null;
// 정렬 기준이 Comparator c로 넘어와서 정렬 기준(비교) 제공
if (c.compare(objArr[j], objArr[j+1]) > 0) {
tmp = objArr[j];
objArr[j] = objArr[j + 1];
objArr[j + 1] = tmp;
}
}
}
}
// default = comparable
static void sort(Object[] a) // 객체 배열에 저장된, 객체가 구현한 Comparable에 의한 정렬
static void sort(Object[] a, Comparator c) // 지정한 Comparator에 의한 정렬
public interface Comparable {
int compareTo(Object o); // 주어진 객체(o)를 자신(this)과 비교
}
// Integer & Comparable
// 기본 정렬 기준 제공
public final class Integer extends Number implements Comparable {
public int compareTo(Object o) {
return compareTo((Integer) o);
}
public int compareTo(Integer anotherInteger) {
int thisVal = this.value;
int anotherVal = anotherInteger.value;
// -1, 0, 1
return (thisval < anotherVal ? -1 : (thisVal == anotherVal ? 0 : 1));
// 위 리턴문은 아래와 같이 표현할 수도 있다. (음수, 0, 양수)
// 다만, 삼항연산자의 연산 속도가 조금이라도 더 빠르기 떄문에, 뺄셈보다는 삼항연산자를 사용한 것이다.
return thisVal - anotherVal
}
}
기본 정렬 기준 외에, 다른 기준으로 정렬하고자 할 때 사용
오름차순, 내림차순 등 다양한 정렬 기준이 있음.
public interface Comparator {
int compare(Object o1, Object o2); // o1, o2 두 객체를 비교 -> 정수값 반환.
// 값이 0이면 같은것, 양수면 왼쪽이 큰것, 음수면 오른쪽이 큰것
boolean equals(Object obj); // equals를 오버라이딩 하라는 뜻
}