1. Comparable
• 기본 정렬 순서를 정의할 때 사용
• package: java.lang
• Comparable 인터페이스 내부에 int compareTo() 메서드가 정의되어있음
• 클래스에 implements 해서 구현, 객체의 기본 정렬 방법을 정의
• 여러 가지 정렬 기준을 정하기는 어려움
import java.util.*;
class Student implements Comparable<Student> {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Student other) {
return this.age - other.age; // 나이 기준 오름차순 정렬
}
}
1-1. CompareTo의 메커니즘
• String Class에서 CompareTo 메서드는 두 문자열을 사전식으로 비교함
• 또한 String Class에서 compareTo 메서드는 final 메서드로, 오버라이딩 할 수 없음
[비교 메커니즘]
1. 첫 번째 문자부터 순차적으로 두 문자열의 각 문자를 비교
2. 두 문자가 다른경우 (유니코드 값)ASCII 값을 기준으로 비교 결과 반환
ex) "Alice"와 "Bob"을 비교할 때, 'A'가 'B'보다 작으므로 음수 값을 반환
3. 두 문자가 같으면 길이를 비교하여 결과 값을 반환
1-2. CompareTo의 비교
① 오름차순 비교 - s1.compareTo(s2)
• s1이 s2보다 사전적으로 앞에 오면 음수 반환
• s1과 s2가 같으면 0 반환
• s1이 s2보다 사전적으로 뒤에 오면 양수 반환
"Apple".compareTo("Banana") // 음수 반환
"Banana".compareTo("Apple") // 양수 반환
"Apple".compareTo("Apple") // 0 반환
② 내림차순 비교 - s2.compareTo(s1)
• s2가 s1보다 사전적으로 앞에 오면 음수 반환
• s2와 s1이 같으면 0 반환
• s2가 s1보다 사전적으로 뒤에 오면 양수 반환
"Apple".compareTo("Banana") // 양수 반환
"Banana".compareTo("Apple") // 음수 반환
"Apple".compareTo("Apple") // 0 반환
2. Comparator
• 특정 정렬 순서를 정의할 때 사용
• package: java.util
• int compare(T o1, T o2)
• 별도의 클래스 또는 익명 클래스로 구현하여 사용
int compare(T o1, T o2); //o1: 비교할 첫 번째 객체. o2: 비교할 두 번째 객체.
class AgeComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
return Integer.compare(s1.getAge(), s2.getAge());
}
}
2-1. compare 메서드의 메커니즘
• o1<o2 (o1이 o2보다 먼저 와야함 의미) : 음수 반환
• o1==o2 : 0 반환
• o1>o2 ( o1이 o2의 뒤에 와야함 의미 ) : 양수 반환
① 오름차순
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2); // 오름차순
}
});
② 내림차순
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2.compareTo(o1); // 내림차순
}
});
3. Comparator에서 compareTo를 사용할 수 있는 경우
• String이나 Integer 같은 클래스들은 이미 Comparable을 구현하고 있으므로,
Comparator에서 compareTo를 사용하여 비교할 수 있다.
• 즉, 비교할 객체가 Comparable을 구현하고 있는 경우 Comparator에서 compareTo를 호출할 수 있다.
'TIL > JAVA' 카테고리의 다른 글
[TIL] Stream을 사용하는 이유, 특징 (1) | 2024.11.28 |
---|---|
[TIL] 람다식 (with. 익명 클래스, 익명 함수) (0) | 2024.11.27 |
[TIL] 생긴게 똑같으면 같은거 아닌가요?🤔 (동일성 vs 동등성) (1) | 2024.11.21 |
[TIL] Getter와 Setter를 사용하는 이유를 항상 고민하자 (2) | 2024.11.14 |
[TIL] 캡슐화와 Getter, Setter(JAVA) (0) | 2024.11.13 |