1.개요
자바 객체를 비교하기 위해서 Comparable
혹은 Comparator
라는 인터페이스를 사용하게 된다. 두 인터페이스의 차이점을 예제로 살펴보도록 하자.
2.예제로 살펴보기
Player 클래스 만들기
1 | public class Player { |
메인 메소드에서 footballTeam을 만들고 정렬을 시도하자.
1 | public static void main(String[] args) { |
아래와 같은 에러가 발생한다. 개인적인 생각으로는 footballTeam을 정렬하고 싶지만, 정렬해야하는 조건을 별도로 지정해주지 않았기 때문에 ranking, name, age 중 어떤 조건으로 정렬해야하는지 알지 못하기 때문에 발생하는 에러이지 않을까하는 생각이 든다.
1 | Error:(17, 20) java: no suitable method found for sort(java.util.List<Player>) |
3.Comparable
Comparable
는 객체 간의 일반적인 정렬이 필요할 때, Comparable
인터페이스를 확장해서 정렬의 기준을 정의하는 compareTo()
메서드를 오버라이딩하여 구현한다. (객체 클래스에 확장하여 사용)
아래 코드에서는 ranking 기준으로 정렬하는 코드이다.
1 | public class Player implements Comparable<Player>{ |
compareTo()
메소드는 구현된 객체와 매개변수로 넘어온 객체를 비교하며, 비교에 따른 결과 값을 return 하게 된다. 객체와 매개변수 객체를 비교 하였을 때 작으면 음수, 같으면 0, 크면 양수를 반환한다.
main 함수를 다시 실행하면 아래와 같이 ranking을 기준으로 정렬된 결과가 출력된다.
1 | Before Sorting : [Player{ranking=59, name='John', age=20}, Player{ranking=67, name='Roger', age=22}, Player{ranking=45, name='Steven', age=24}] |
4.Comparator
Comparator
는 객체 간의 특정한 정렬이 필요할 때, Comparator
인터페이스를 확장해서 특정 기준을 정의하는 compare()
메소드를 오버라이딩하여 구현한다.
아래는 ranking과 age로 정렬하는 별도의 구현 클래스이다.
1 | public class PlayerRankingComparator implements Comparator<Player> { |
1 | public class PlayerAgeComparator implements Comparator<Player> { |
아래와 같이 정렬 기준 클래스를 호출하여 정렬에 이용할 수 있다.
1 | PlayerRankingComparator playerComparator = new PlayerRankingComparator(); |
5.다중 조건 정렬
위에서는 한가지 정렬 조건만을 이용해서 정렬을 했었다. 여러 개의 정렬 조건을 이용하고 싶다면, 자바8 이상에서는 lambda expression을 사용하면 쉽게 다중 조건 정렬을 할 수 있다.
아래 코드는 ranking 오름차순 정렬 후 age로 오름차순 정렬하는 코드이다.
1 | footballTeam.sort(Comparator.comparing(Player::getRanking).thenComparing(Player::getAge)); |
6.정리
Primitive Type나 Reference Type은 기본적으로 Java에서 제공해주는 Object의 경우는 기본적으로 Comparable
인터페이스를 구현하고 있어서 Arrays.sort
같은 함수를 사용하면 자동으로 자연적인 정렬(오름차순)이 가능하다. 하지만 별도로 만든 객체를 sort 메소드를 통해서 정렬하거나, 혹은 특정한 조건을 기반으로 정렬하는 경우는 반드시 Comparable
인터페이스를 구현하여야 직접 정렬 기준을 구현하여야 한다.Comparator
은 Reference Type을 내가 원하는대로 정렬하고 싶을때나 기존에 구현된 Comparable
의 정렬과는 다른 결과를 얻고 싶을 때 사용한다.
참고 사이트
https://www.baeldung.com/java-comparator-comparable
https://dev-daddy.tistory.com/23
https://jeong-pro.tistory.com/173
https://javaplant.tistory.com/15