본문 바로가기
국비 학원 가서 개발새발

Comparable 과 Comparator 차이(익명클래스 사용)

by 휴일이 2022. 10. 10.

 

자바 문제를 풀다가 궁금한 점...

compareTo 를 오버라이딩해서 내림차순 비교를 하라는 내용이었는데

compareTo 를 처음 들어봐서 찾아보다가

Comparable과 Comparator의 차이까지 타고 들어갔다

 

 

둘 다 인터페이스이고 객체를 비교하는 것은 같으나

 

Comparable -> 자기 자신과 들어온 객체 비교

Comparator -> 들어온 객체 두 개를 비교

 

 

 

<Comparable>

@Override

public int comparTo(T o) { return int값 }

오버라이딩 해서 이용

 

인터페이스라서

implements Comparable 해야 됨

 

자기 자신을 기준으로 삼아

매개 변수 객체를 비교해 대소 관계 파악

 

 

1. 조건문과 <, >, == 사용

ㄴ> 1, 0, -1 반환

 

if(this.age>o.age) return 1;

else if(this.age==o.age) return 0;

else return -1;

 

 

2.두 비교대상 값 차이 비교

return this.age - age;

 

 

두 번째가 더 편해보이지만

오버플로우, 언더플로우(인트 허용범위 넘어가는 거)

될 수 있으니

불안하면 길어도 첫 번째 방법 이용하기

 

 

int isBig = a.compareTo(b); ->자기 자신(a)와 b 객체 비교

if (isBig>0) a가 b보다 크다

else if (isBig==0) a와 b는 같다

else a가 b보다 작다

 

 

 

 

<Comparator> - 익명 클래스로 이용

compare(T o1,T o2)

두 매개 변수의 객체를 비교한다

(자기 자신은 관련 없음)

 

만약 a,b,c를 비교하려면

어느 한 객체가 반드시 필요함(객체를 통해 비교해야하니까)

딱 Comparator 기능만 이용하고 싶다면

"익명 클래스"가 답이다

 

 

Comparator<Student> c = new Comparator<Student>() {

@override

public int compare(Student s1,Student s2) {

return o1.number-o2.number;

}

 

c.comparable(a, b);

 

하면 됨

 

 

어차피 한 번 비교하는 거면

한 번 쓰고 버리면 되니까

저게 더 코드를 깨끗하게 만든다

귀찮게 저거 하나 쓰려고

인터페이스 구현 안 해도 됨 ㅎㅎ

 

 

 

 

Comparable과 Comparator을 쓰는 이유?

보통 자바는 오름차순으로 정렬하니까

이 말은 선행 원소가 후행 원소보다 '작다'는 뜻이다

 

내림차순으로 정렬하고 싶을 때,

비교 결과가

음수 : 두 원소의 위치를 교환 안 함

양수 : 두 원소의 위치를 교환함

 

두 개를 비교해서, 양수가 나오면 ---> 위치 교환(내림차순) 가능

이걸로 객체 배열을 내림차순으로 출력할 수 있다

 

 

 

 

Comparable (compareTo) 이용 내림차순

    @Override
    public int compareTo(Student obj) {
        return this.total-obj.total;
    }

class 클래스명 implements Comparable<클래스명> <<<<-이거 필수 ㅠㅠ!!!

내꺼-니꺼 (정방향)

니꺼-내꺼 (역방향)

 

 

 

 

Comparator(compare) 이용 내림차순

@Override
public int compare(Student o1,Student o2) {
    return o1.total - o2.total;
}

 

 

 

 

공부하면서

익명 클래스에 대해서도

다시 한 번 제대로 알 수 있어서

좋은 시간이었다!

 

 

 

728x90