- Comparable와 Comparator 정리2021년 04월 14일 00시 30분 14초에 업로드 된 글입니다.작성자: jCurve728x90반응형
오늘은 Comparable과 Comparator의 차이와 그 사용법에 대해 정리해 보겠습니다
우선 java에서 제공되는 정렬이 가능한 클래스들은 모두 Comparable을 구현하고 내부적으로 compareTo()메서드를 재정의 해 구현 방식에 따라 정렬을 수행합니다.
Ineger, String, 등등 많이 보이죠? 이것들이 내부적으로 Comparable을 구현하고 있습니다. Integer 클래스를 예로 보면
이런식으로 구현하고 있죠?
이렇게 구현한 클래스를 사용하는 방법으로는 다음 두 가지가 있습니다.
- Arrays.sort()
- Collections.sort()
두 개의 차이는 Arrays.sort()에 경우 primitive array와 object array둘 다 동작할 수 있도록 내부적으로 구현이 되어 있고
Collections.sort()는 List Collection을 정렬할 경우 사용합니다.
이것도 자세히 한 번 볼까요?
우선 Comparable interface 설명 밑에 이렇게 나와있네요 "리스트와 배열의 오브젝트가 해당 인터페이스를 구현하고 있으면 collections.sort(arrays.sort)로 자동 정렬이 가능하다(Comparator 구현 없이)"
우선 Arrays.sort()부터 봅시다.
Arrays.sort()는 primivitve 배열과 Object 배열의 sort()를 구현하고 있는데요
primitive array의 경우 Dual-Pivot Quicksort 알고리즘을 적용해서 O(n log(n))의 수행시간을 보여준다고 합니다.
object array의 경우 TimSort(Merge Sort + Insertion Sort)를 사용한다고 나와있습니다.
Collections.sort()는?
Collections.sort()의 경우 List Collection을 정렬할 때 사용하는데
ArrayList,LinkedList,Vector 등등
내부 스펙을 보면 List를 구현하는 객체들을 정렬할 때 사용하는 것을 볼 수 있습니다.
또한 Collections.sort()도 내부적으로는 Arrays.sort()를 사용한다고 하네요
한 번 직접 만들어 봅시다
원하는데로 정렬이된다.
이제 Interface Comparator에 대해 알아 봅시다
@FunctinalInterface 애너테이션이 있어 람다식으로 작성이 가능하다.
Comparable 인터페이스를 구현한 클래스들을 정렬할 때 기본으로 설정된 정렬 기준과 다르게 정렬하고 싶을 때 사용한다.
구현 방식은 간단하게 클래스에 Comparator인터페이스를 구현하여 compare()메서드를 오버라이딩 하면 되는데 굳이 인터페이스 메서드 하나 오버라이딩 하려고 새로운 클래스 만들 필요가 없기 때문에 보통 익명 클래스나 람다식으로 많이들 사용한다.
위의 예시에 바로 적용해 보자
익명 클래스로 구현 X는 내림 차순 Y는 오름 차순으로 아까와 반대의 정렬기준이 적용된 것을 확인할 수 있다.
이번엔 람다식으로 해보자
훨씬 간단하게 x기준 내림차순으로 정렬할 수 있고
y조건까지 추가하여 x기준 내림차순 y기준 내림차순으로 정렬 조건을 지정할 수 있다.
반응형'JAVA' 카테고리의 다른 글
private method test 기능을 테스트할까? 구현을 테스트할까? (0) 2021.07.12 Iterator 정리 (0) 2021.05.15 Shallow Copy & Deep Copy (0) 2021.04.13 Hash (0) 2021.04.10 Listener 와 Adapter (0) 2021.04.10 댓글