본문 바로가기
언어/JAVA

[JAVA] Comparable vs Comparator

by steadyMan 2023. 7. 31.

Comparable, Comparator는 정렬 인터페이스로 List의 정렬이나 클래스의 정렬조건을 설정할 때 등

정렬과 관련된 기능을 수행할때 사용할 수 있습니다. 둘은 정렬기준을 설정한다는 공통점이 있고

사용법에는 차이가 있는데 Comparable, Comparator의 차이점과 사용방법에 대해 작성해 볼까 합니다.


시작하기에 앞서 의문점이 하나 있었는데요

@FunctionalInterface

두 인터페이스 모두 함수형 인터페이스로 알고 있었는데

@FunctionalInterface 애노테이션이 없습니다.

어째서 인지 Comparable에는 @FunctionalInterface 애노테이션이 보이지 않습니다.

ComparablecompareTo()추상메소드 오직 하나만을 가지고 있는데 말입니다.

그렇다면 @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가 큰 수면 음수가 리턴되고 내림차순 정렬됩니다.

댓글