📌 Comparator, Comparable 사용이유
primitive 타입(int, double 등)의 실수 변수는 부등호를 통해 두 변수를 비교할 수 있다.
→ 기본 자료형이기 때문에 부등호로 쉽게 비교가 가능하다.
❓ 그렇다면 새로운 클래스 객체는 어떻게 비교할까
→ comparator, comparable를 사용하여 객체를 비교한다.
Comparable과 Comparator는 모두 인터페이스(interface)이다
즉, Comparable 혹은 Comparator의 사용을 위해서는 인터페이스 내에 선언된 메소드를 반드시 구현해야한다.
[ comparable 특징 ]
- 자기 자신과 매개변수를 비교한다.
- Comparable은 lang패키지에 있기 때문에 import 를 해줄 필요가 없다.
[ comparator 특징 ]
- 파라미터로 들어오는 두 객체를 비교한다.
- Comparator는 util패키지에 있기 때문에 import 해주어야 한다.
📌 Comparable
- Comparable 인터페이스에는 compareTo(T o) 메소드 하나가 선언되어있는 것을 볼 수 있다.
- 이 말은 우리가 만약 Comparable을 사용하고자 한다면 compareTo 메소드를 **재정의(Override/구현)**을 해주어야 한다는 것이다.
- comparable은 자기 자신과 객체 매개변수 객체를 비교한다.
값을 비교하는 방법
- 자기 자신을 기준으로 들어온 매개변수를 비교한다
- 즉 자기 자기자신을 기준으로 삼아 대소관계를 파악한다.
3 | ||
5 | 5 | |
6 |
- 나 자신이 5라고 할때
- 들어온 매개변수가 3인 경우 : 나 자신은 2가 더 크다 (+2 : 양수)
- 들어온 매개변수가 5인 경우 : 나자신과 같다 (0)
- 들어온 매개변수가 6인 경우 : 나 자신은 1이 더 작다. ( -1 : 음수 )
📌 Comparable 참고코드
class Student implements Comparable<Student> {
int age; // 나이
int classNumber; // 학급
Student(int age, int classNumber) {
this.age = age;
this.classNumber = classNumber;
}
@Override
public int compareTo(Student o) {
// 자기자신의 age가 o의 age보다 크다면 양수
if(this.age > o.age) {
return 1;
}
// 자기 자신의 age와 o의 age가 같다면 0
else if(this.age == o.age) {
return 0;
}
// 자기 자신의 age가 o의 age보다 작다면 음수
else {
return -1;
}
}
}
📘 compareTo의 return 방식을 아래와 같이 사용해서 양수, 음수, 0을 구분할 수 있다.
return this.age - o.age;
- 위와 같은 방식을 사용하면 뺄셈 과정에서 자료형의 범위를 넘어버리는 경우가 발생할 수 있기 때ansdp overflow가 발생할 수 있다.
📌 Comparator
- Comparator 인터페이스에는 선언 된 메소드가 많다.
- 실질적으로 구현해야하는 것은 compare(T o1, T o2) 다.
- Comparator는 자기 자신의 상태와는 상관없이 파라미터로 들어오는 두 객체를 비교하는 것이다.
📌 Comparator 참고코드
import java.util.Comparator; // import 필요
class Student implements Comparator<Student> {
int age; // 나이
int classNumber; // 학급
Student(int age, int classNumber) {
this.age = age;
this.classNumber = classNumber;
}
@Override
public int compare(Student o1, Student o2) {
// o1의 학급이 o2의 학급보다 크다면 양수
if(o1.classNumber > o2.classNumber) {
return 1;
}
// o1의 학급이 o2의 학급과 같다면 0
else if(o1.classNumber == o2.classNumber) {
return 0;
}
// o1의 학급이 o2의 학급보다 작다면 음수
else {
return -1;
}
}
}
📌 참고 블로그
https://st-lab.tistory.com/243
자바 [JAVA] - Comparable 과 Comparator의 이해
아마 이 글을 찾아 오신 분들 대개는 Comparable과 Comparator의 차이가 무엇인지 모르거나 궁금해서 찾아오셨을 것이다. 사실 알고보면 두 개는 그렇게 어렵지 않으나 아무래도 자바를 학습하면서 객
st-lab.tistory.com
'JAVA' 카테고리의 다른 글
[ java ] 배열 (복사, 비교) , 2차원배열 개념 (0) | 2024.12.04 |
---|---|
[ java ] String 클래스(문자열 분리, 비교) (0) | 2024.12.04 |
[ java ] Comparable, Comparator 와 정렬의 관계 (0) | 2024.12.03 |
[ java ] 조건문 (0) | 2024.12.03 |
[ java ] 반복문 (0) | 2024.12.03 |