Comparable
, Comparator
는 정렬 인터페이스로 List의 정렬이나 클래스의 정렬조건을 설정할 때 등
정렬과 관련된 기능을 수행할때 사용할 수 있습니다. 둘은 정렬기준을 설정한다는 공통점이 있고
사용법에는 차이가 있는데 Comparable
, Comparator
의 차이점과 사용방법에 대해 작성해 볼까 합니다.
시작하기에 앞서 의문점이 하나 있었는데요
@FunctionalInterface
두 인터페이스 모두 함수형 인터페이스로 알고 있었는데
어째서 인지 Comparable
에는 @FunctionalInterface 애노테이션이 보이지 않습니다.
Comparable
은 compareTo()
추상메소드 오직 하나만을 가지고 있는데 말입니다.
그렇다면 @FunctionalInterface 애노테이션이 없으면 함수형 인터페이스가 아닌 걸까요?
확인한 바로는 그렇지 않습니다.
자바 스펙에서 정의한 함수형 인터페이스는 "추상 메서드가 하나만 있는 인터페이스"이기에 애노테이션이 없다고
함수형 인터페이스가 아니라고는 할 수 없습니다.
그렇다면 @FunctionalInterface 애노테이션의 역할은 뭘까요?
- 컴파일러 에러 확인
- @FuncionalInterface가 명시되면 컴파일러는 추상 메소드가 하나 인지를 확인합니다. 만약 조건이 만족이 안되면 컴파일 에러가 발생합니다. 즉 규칙을 강제할 수 있는 겁니다
- 가독성 향상
- @FuncionalInterface가 명시되어 있으면 다른 개발자가 해당 인터페이스를 수정할 때 이 인터페이스가 함수형 인터페이스로 사용되어야 함을 알 수 있고 더 명확하게 함수형 인터페이스임을 나타낼 수 있다.
결론은 Comparator도 함수형 인터페이스이다!입니다.
Comparator
Comparator
는 compare()를 사용하여 정렬기준을 정합니다. compare()는 비교 대상을 차례대로
받아 return 값의 결과(음수, 0, 양수)에 따라 정렬기준이 정해집니다.
여기서부터는 제가 이해한 기준으로 작성하겠습니다.
- 음수 : 우선순위 낮춘다.
- 0 : 변경하지 않는다.
- 양수 : 우선순위를 높인다.
만약 숫자형 데이터를 오름차순으로 정렬하면 "낮은 숫자"가 앞쪽으로 즉 낮은 숫자의
정렬 우선순위를 낮추면 됩니다.
compare(T o1, T o2)의 첫 번째 파라미터를 기준으로 설정하면 됩니다.
return o1 - o2
을 정렬기준으로 하면 o1가 o2보다 낮은 숫자면 음수가 리턴되고
큰 숫자면 양수가 리턴됩니다. 즉 낮은 숫자면 음수로 o1의 정렬순위가 낮아져서 앞쪽으로
큰 숫자면 o1의 정렬순위가 높아져 뒤쪽으로 가게 됩니다.
Person 클래스 4개가 입력된 List가 있습니다. weight기준 오름차순으로 정렬해 보겠습니다.
weight 기준으로 오름차순 정렬된 걸 확인할 수 있습니다. 내림차순 정렬하려면 반대로
return o2.getWeight() - o1.getWeight()
로 해주시면 됩니다. o1의 weight가 낮은 수라면 양수가
리턴되어 내림차순 정렬됩니다.
만약 weight 기준으로 내림차순 정렬하는데 name이 "KIN"인 사람을 맨 앞으로 정렬해야 한다면 어떨까요
name이 "KIN"인 Person클래스는 weight가 낮음에도 맨앞으로 정렬됐습니다.
o1의 name이 "KIN"이라면 음수리턴으로 앞으로 보내고
o2의 name이 "KIN"이라면 양수를 리턴해서 o1를 뒤로 보냈기 때문입니다.
모든 건 첫 번째 파라미터 기준으로 생각하면 됩니다.
Comparable
Comparator
과 정렬기준(음수, 0, 양수)이 동일합니다.
Comparable
은 compare(T o) 메서드에서 "this"를 기준으로 정렬설정하면 됩니다.
"this"의 weight가 큰 수면 음수가 리턴되고 내림차순 정렬됩니다.
'언어 > JAVA' 카테고리의 다른 글
[JAVA] UTC, GMT (0) | 2024.07.07 |
---|---|
[JAVA] emptyMap 사용 시 UnsupportedOperationException (0) | 2023.03.22 |
[JAVA] 상수의 여러 관리법 (0) | 2022.12.11 |
[Lombok] 자주 사용하는 어노테이션과 주의점 (0) | 2022.09.18 |
[JAVA] Optional 사용법 - 어떻게 사용해야할까 (2/2) (0) | 2022.07.28 |
댓글