Comparable/Comparator
두 인터페이스는 객체를 비교할 수 있도록 만드는 기능을 갖고있다.
객체를 비교한다? 이해가 쉽지않다. 잘 생각해보자,
만약, primitive 타입의 실수 변수의 경우엔 부등호를 갖고 쉽게 비교가 가능하다.
하지만 객체 끼리 비교는 그 기준이 모호하여 비교가 힘들다.
자동차로 비교를 해보자 안곰돌과 이승냥은 서로 좋은 자동차를 선택 하려고 한다. 안곰돌의 "좋은 자동차"의 조건은 최근 연식의 자동차가 좋은 자동차이다. 하지만 이승냥의 "좋은 자동차"의 조건은 높은 배기량이 좋은 자동차이다. 안곰돌과 이승냥의 "좋은 자동차"를 고르기를 한다면 서로 다른 종류의 자동차를 선택할 것이다. 따라서 객체 끼리의 비교는 그 "기준"이 필요하며 그 "기준"을 정하고 서로 비교를 할 수 있게 만드는 인터페이스가 Comparable와 Comparator이다.
차이점
두 인터페이스의 차이점은 Comparable은 "자기 자신과 매개변수 객체를 비교"하는 것이고, Comparator는 "두 매개변수 객체를 비교" 한다는 것이다.
Comparable
"자기 자신과 매개변수 객체를 비교"하는 인터페이스이다. 코드로 살펴보자,
public class car implements Comparable<car> {
int yearModel; //연식
int displacement; //배기량
public car(int yearModel, int displacement) {
this.yearModel = yearModel;
this.displacement = displacement;
}
@Override
public int compareTo(car o) {
//구현
}
}
이제 CompareTo 메소드를 구현해야 한다. 만약 연식을 비교를 하자고 하면 자기 자동차의 연식과 매개변수로 들어온 자동차의 O의 연식의 값을 비교하면 된다.
public class car implements Comparable<car> {
int yearModel; //연식
int displacement; //배기량
public car(int yearModel, int displacement) {
this.yearModel = yearModel;
this.displacement = displacement;
}
@Override
public int compareTo(car o) {
//자기자신의 yearModel가 O의 yearModel보다 크다면 양수
if(this.yearModel > o.yearModel) return 1;
//자기자신의 yearModel가 O의 yearModel보다 같다면 0
else if (this.yearModel == o.yearModel) return 0;
//자기자신의 yearModel가 O의 yearModel보다 작다면 음수
else{ return -1;}
}
}
위의 코드에선 값'을 비교하여 1,0,-1로 반환을 했지만 꼭 그렇게 반환을 해야 하는 것은 아니다.
"자기 자신"과 "상대방"을 비교하여 양수,0,음수로 표현을 해도 된다. 즉,
public class car implements Comparable<car> {
int yearModel; //연식
int displacement; //배기량
public car(int yearModel, int displacement) {
this.yearModel = yearModel;
this.displacement = displacement;
}
@Override
public int compare(car o1, car o2) {
return o1.yearModel-o2.yearModel;
}
}
이렇게 한줄로 가능하다.
테스트를 해보자 !
package JAVA;
import java.util.Comparator;
public class car implements Comparable<car> {
int yearModel; //연식
int displacement; //배기량
public car(int yearModel, int displacement) {
this.yearModel = yearModel;
this.displacement = displacement;
}
@Override
public int compareTo(car o) {
return this.yearModel-o.yearModel;
}
public static void main(String[] args) {
car car_1= new car(1,1600);
car car_2 = new car(10,6300);
car car_3 = new car(5,3300);
int isBig = car_1.compareTo(car_2);
System.out.println(isBig);
if(isBig>0) System.out.println("car_1이 car_2보다 큼");
else if(isBig>0) System.out.println("car_1와 car_2는 똑같다");
else{ System.out.println("car_1이 car_2보다 작음");}
}
}
Comparator
매개변수로 들어오는 두 객체를 비교하는 인터페이스이다. 따라서 당연히 매개변수가 두 개가 되는 것이다.
코드로 살펴보자,
package JAVA;
import java.util.Comparator;
public class car implements Comparator<car> {
int yearModel; //연식
int displacement; //배기량
public car(int yearModel, int displacement) {
this.yearModel = yearModel;
this.displacement = displacement;
}
@Override
public int compare(car o1, car o2) {
//구현
}
}
이제 comapre 메소드를 구현해보자.
public class car implements Comparable<car> {
int yearModel; //연식
int displacement; //배기량
public car(int yearModel, int displacement) {
this.yearModel = yearModel;
this.displacement = displacement;
}
@Override
public int compare(car o1, car o2) {
//o1 yearModel가 o2의 yearModel보다 크다면 양수
if(o1.yearModel > o2.yearModel) return 1;
//o1 yearModel가 o2의 yearModel보다 같다면 0
else if (o1.yearModel == o2.yearModel) return 0;
//o1의 yearModel가 o2의 yearModel보다 작다면 음수
else{ return -1;}
}
}
앞서 Comparable의 CompareTo()와는 다르게, 두 객체를 비교하는 것이기 때문에 파라미터로 들어오는 O1과 O2의 yearModel를 비교해주는 것이다.
Comparable와 같게 간략하게 할 수 있다.
package JAVA;
import java.util.Comparator;
public class car implements Comparator<car> {
int yearModel; //연식
int displacement; //배기량
public car(int yearModel, int displacement) {
this.yearModel = yearModel;
this.displacement = displacement;
}
@Override
public int compare(car o1, car o2) {
return o1.yearModel-o2.yearModel;
}
}
테스트를 해보자,
package JAVA;
import java.util.Comparator;
public class car implements Comparator<car> {
int yearModel; //연식
int displacement; //배기량
public car(int yearModel, int displacement) {
this.yearModel = yearModel;
this.displacement = displacement;
}
@Override
public int compare(car o1, car o2) {
return o1.yearModel-o2.yearModel;
}
public static void main(String[] args) {
car car_1= new car(1,1600);
car car_2 = new car(10,6300);
car car_3 = new car(5,3300);
int isBig = car_1.compare(car_2,car_3);
if(isBig>0) System.out.println("car_2이 car_3보다 큼");
else if(isBig>0) System.out.println("car_2와 car_3 똑같다");
else{ System.out.println("car_2이 car_3보다 큼");}
}
}
참고
아래 블로그에 더 자세한 내용이 있다!
'Programming > Back-end Language' 카테고리의 다른 글
[Spring] WebClient 란? (0) | 2022.08.29 |
---|---|
[Spring] @Valid를 이용한 유효성검증 (1) | 2022.06.17 |
[JAVA] BufferedReader와 StringTokenizer 사용법 (0) | 2022.05.09 |
[JAVA] ConcurrentModificationException 오류 원인 및 해결 방법 (0) | 2022.05.02 |
[JAVA] 컬렉션 프레임워크란? (List/Set/Map) (2) | 2022.04.28 |