관리 메뉴

Life goes slowly...

[Java] 자바에서 객체 정렬하기 - Comparable, Comparator 본문

프로그래밍/Java

[Java] 자바에서 객체 정렬하기 - Comparable, Comparator

빨강소 2020. 10. 17. 00:11
728x90
반응형

Java와 같은 객체 지향 프로그램 언어를 사용하게 되면 객체들을 기준에 맞춰서 정렬해야 하는 경우가 있습니다. 객체의 정렬 기준을 명시하는 방법에 따라서 Comparable 과 Comparator 두 가지 방법이 있습니다. 단순한 숫자나 문자와 같은 기본형 데이터는 사람들이 일반적으로 받아들이는 대소 비교라는 개념이 있으며, 그에 따라서 정렬을 할 수 있습니다. 하지만 특정 타입의 객체는 기본형 데이터와 다르게 정렬 기준이 없기 때문에 정렬을 할 수가 없어서 정렬 기준을 정의하여 하며 그에 따른 정렬 기준에 따라서 정렬하게 됩니다.

 

Comparable

정렬 수행 시 기본적으로 적용되는 정렬 기준이 되는 메소드를 정의하는 인터페이스입니다. Java에서 제공되는 정렬 가능한 클래스는 모두 Comparable 인터페이스를 구현하고 있으며, 정렬 시에 이에 맞춰서 정렬이 수행되게 됩니다.

 

사용되는 Package : java.lang.Comparable

 

Comparable 인터페이스를 implements 하고 내부에 있는 compareTo() 메소드를 오버라이드 하여 원하는 정렬 기준대로 구현하여 사용할 수 있습니다. Java에서 제공되는 모든 정렬 클래스는 Comparable 인터페이스를 구현하고 있으며, Comparable 구현 내용에 맞춰서 정렬이 수행됩니다.

 

int[] scores = {899, 982, 1090, 982, 1018};
Arrays.sort(scores);
System.out.println(Arrays.toString(scores));
[899, 982, 982, 1018, 1090]
List<Player> players = new ArrayList<>();
players.add(new Player("Alice", 899));
players.add(new Player("Bob", 982));
players.add(new Player("Chloe", 1090));
players.add(new Player("Dale", 982));
players.add(new Player("Eric", 1018));

Collections.sort(players);
System.out.println(players);
[Player(name=Chloe, score=1090), Player(name=Eric, score=1018), Player(name=Bob, score=982), Player(name=Dale, score=982), Player(name=Alice, score=899)]

 

 

Comparator

정렬 가능한 클래스(즉 Comparable 인터페이스를 구현한 클래스)들의 기본 정렬 기준과 다르게 정렬하고 싶을 때 사용되는 인터페이스입니다. 주로 익명 클래스로 사용되며, 내림차순으로 정렬할 때 많이 사용됩니다.

 

사용되는 Package : java.lang.Comparator

 

Comparator 인터페이스를 implements 하고 내부에 있는 compare() 메소드를 오버라이드 하여 원하는 정렬 기준대로 구현하여 사용할 수 있습니다.

Comparator<Player> comparator = new Comparator<Player>() {
    @Override
    public int compare(Player a, Player b) {
        return b.getScore() - a.getScore();
    }
};

-----------------------------------------------------------------------

List<Player> players = new ArrayList<>();
players.add(new Player("Alice", 899));
players.add(new Player("Bob", 982));
players.add(new Player("Chloe", 1090));
players.add(new Player("Dale", 982));
players.add(new Player("Eric", 1018));

Collections.sort(players, comparator);
System.out.println(players); 
[Player(name=Chloe, score=1090), Player(name=Eric, score=1018), Player(name=Bob, score=982), Player(name=Dale, score=982), Player(name=Alice, score=899)]

 

 

 

728x90
반응형
Comments