Comparable & Comparator
원래 비교할 수 없는 객체들끼리의 비교를 가능하게 해 주는 인터페이스입니다.
둘 다 인터페이스이기 때문에,
Comparable, Comparator 를 사용하려면 인터페이스 내에 선언된 메소드를 반드시 먼저 구현해야 합니다.
즉,
Comparable 인터페이스에는 compareTo(T o) 메소드가 선언되어 있으므로,
CompareTo 메소드를 구현(재정의=오버라이드)해야 하고
Comparator 인터페이스에는 compare(T o1, To2) 메소드를 선언되어 있으므로,
Comparator 메소드를 구현해야 합니다.
Comparable
Comprable은 자기 자신과 매개변수 객체를 비교하고자 할 때 사용합니다.
따라서 다음과 같이 작성하게 됩니다.
class 클래스A implements Comparable<클래스A> {
public int compareTo(클래스A o) {
// 자기자신>o : 양수
if( ... ) {
return 1;
}
// 자기자신=o : 0
if( ... ) {
return 0;
}
// 자기자신<0 : 음수
if( ... ) {
return -1;
}
}
}
조금 더 간단히 표현하고자 한다면 다음과 같이 작성할 수도 있습니다.
class 클래스A implements Comparable<클래스A> {
public int compareTo(클래스A o) {
//사실, 양수/0/음수 로 구분되기 때문에
//다음과 같이 자기자신-o 의 값을 return 하는 방법도 가능하다.
return this.변수이름 - o.변수이름;
//단, underflow와 overflow로 인해 비교 결과가 반대로 나오는 경우를 주의해야한다.
}
}
Comparator
이에 비해 Comparator는 자기 자신과는 상관없이 입력된 두 객체(o1, o2)와의 비교를 수행합니다.
class 클래스A implements Comparator<클래스A> {
public int compare(클래스A o1, 클래스A o2) {
// o1>o2 : 양수
if( ... ) {
return 1;
}
// o1=o2 : 0
if( ... ) {
return 0;
}
// o1<o2 : 음수
if( ... ) {
return -1;
}
}
}
물론 아까와 같은 방식으로 간단히 작성할 수도 있습니다.
class 클래스A implements Compartor<클래스A> {
public int compare(클래스A o1, 클래스A o2) {
//아까와 같이 o1-o2 의 값을 return 하는 방법도 가능하다.
return o1.변수이름 - o2.변수이름;
//underflow와 overflow로 인해 비교 결과가 반대로 나오는 경우는 여전히 주의해야한다.
}
}
하지만 Comparator가 자기 자신과는 상관 없이 입력된 값 두 가지 사이의 비교를 한 다는 점 때문에,
복잡한 코드에서는 이 부분이 꽤 헷갈릴 수 있습니다.
그래서 보통 다음과 같이 comp와 같은 익명 객체를 이용하여 재정의를 하는 경우가 많습니다.
public static Comparator<클래스A> comp = new Comparatir<클래스A>() {
@Override
public int compare(클래스A o1, 클래스A o2) {
return o1.변수이름 - o2.변수이름;
}
}
'BackEnd > Java' 카테고리의 다른 글
[Java] 생성자 오버로딩 (0) | 2022.03.17 |
---|---|
[Java] 메소드 (0) | 2021.08.23 |
[Java] next() 와 nextLine()의 차이와 주의점 (0) | 2021.08.23 |
[Java] DBeaver 이클립스에 연결하기 (0) | 2021.08.17 |
[Java] 웹 디자인 프로그램 Oven, adobe XD (0) | 2021.08.11 |
댓글