자바 문제를 풀다가 궁금한 점...
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;
}
공부하면서
익명 클래스에 대해서도
다시 한 번 제대로 알 수 있어서
좋은 시간이었다!
'국비 학원 가서 개발새발' 카테고리의 다른 글
국비학원 10일차) 추상클래스, 인터페이스 // 예습:Collection, List, Stack, Queue (0) | 2022.10.12 |
---|---|
예습)예외 처리(try-catch) (0) | 2022.10.10 |
예습) 프로그램 오류(에러와 예외) (0) | 2022.10.09 |
예습) 디폴트 메서드와 스태틱 메서드(인터페이스) , 내부클래스... (1) | 2022.10.08 |
국비학원 9일차) 상속, instanceof, 타입변환... 예습)인터페이스 (1) | 2022.10.08 |