[Comparable]
docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#method.summary
Comparable 문서를 보면 알겠지만 compareTo(T o) 메소드 하나만 선언이 되어있음을 알 수 있다. 즉, Comparable 을 사용하고자 한다면 compareTo(T o) 메소드를 Override 해주어야 한다.
[Comparator]
docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#method.summary
Comparator는 선언된 메소드가 많지만 실질적으로 자주 사용하는 메소드는 compare(T o1, T o2) 이다.
Comparable, Comparator 인터페이스 사용 이유
int a = 1;
int b = 3;
if(a>b) System.out.println(a);
else System.out.println(b);
일반적인 primitive 타입의 변수는 위와같이 부등호를 통해 변수의 비교가 쉽다.
public class Test {
public static void main(String[] args) {
People people1 = new People("sebang", 29);
People people2 = new People("nebang", 25);
}
}
class People{
String name;
int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
}
하지만 위와같이 객체간의 비교를 하고자 할때에는 어려움을 겪는다.
이때 필요한 인터페이스가 Comparable, Comparator이다.
Comparable은 자기자신과 매개변수 객체를 비교, Comparator는 두개의 매개변수 객체를 비교하는 것이다.
Comparable
package String;
public class Test {
public static void main(String[] args) {
People people1 = new People("sebang", 29);
People people2 = new People("nebang", 25);
}
}
class People implements Comparable<People>{
String name;
int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(People o) {
if(this.age>o.age)
return 1;
else if (this.age==o.age)
return 0;
else return -1;
}
}
필수 구현 부분인 compareTo(T o) 메소드를 통해 비교문을 만들 수 있다.
자기 자신인 People과 다른 People을 비교하기위해 Comparable<>에서 <> 이부분에 People 객체를 넣었다.
자기 자신인 People가 다른 People의 나이보다 많으면 1을, 같으면 0을, 적으면 -1을 반환하게 하여 자기 자신과 다른 사람의 차이값을 반환하게 하였다.
@Override
public int compareTo(People o) {
return this.age - o.age;
}
다만 이런식으로 자신과 다른사람의 나이차이 자체를 반환하는 방법도 있다.
public class Test {
public static void main(String[] args) {
People people1 = new People("sebang", 29);
People people2 = new People("nebang", 25);
int whoIsBig = people1.compareTo(people2);
if(whoIsBig>0){
System.out.println("1번이 2번보다 많습니다.");
}
else if(whoIsBig==0){
System.out.println("두 객체의 나이가 같습니다.");
}
else {
System.out.println("1번이 2번보다 적습니다.");
}
} //1번이 2번보다 많습니다.
}
class People implements Comparable<People>{
String name;
int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(People o) {
return this.age - o.age;
}
}
다만 두 값의 차이를 이용한 방식이기 때문에 각 자료형의 최댓값과 최솟값을 넘어가 overflow가 일어나지 않도록 주의해야 한다.
Comparator
public class Test {
public static void main(String[] args) {
People people1 = new People("sebang", 29);
People people2 = new People("nebang", 25);
People people3 = new People("dobang", 27);
int whoIsBig = people1.compare(people2, people3);
if(whoIsBig>0){
System.out.println("2번이 3번보다 많습니다.");
}
else if(whoIsBig==0){
System.out.println("3번과 3번의 나이가 같습니다.");
}
else {
System.out.println("2번이 3번보다 적습니다.");
}
}
}
class People implements Comparator<People> {
String name;
int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compare(People o1, People o2) {
return o1.age - o2.age;
}
}
people1의 객체의 compare 메소드를 통해 비교하지만, 객체 내부의 작동방식을 살펴보면 두 매개변수인 people2와 people3이 비교되는것이기 때문에 people1과는 관련없이 두 객체의 비교값을 반환한다.(people1.compare(people1,people2) 사용시 peopl1과 비교 가능)
출처 : https://st-lab.tistory.com/243
'자바' 카테고리의 다른 글
[자바] 힙(heap)과 스택(stack) 메모리 구조 (0) | 2023.01.18 |
---|---|
[자바] BufferedReader / StringTokenizer (0) | 2023.01.15 |
[자바] CompareTo (0) | 2023.01.13 |
[자바] 람다식 개념 및 표현법 (0) | 2023.01.12 |
HashSet기초 (자바) (0) | 2023.01.07 |