지금을 사는 사람

[Java] CompareTo 와 Comparator 본문

Java

[Java] CompareTo 와 Comparator

지금회 2024. 1. 5. 09:54
728x90

예제: 객체 목록 정렬

가령 namerating 속성을 가진 Game 클래스가 있다고 가정해봅시다.

public class Game implements Comparable<Game> {
    private String name;
    private double rating;

    // 생성자, 게터, 세터 등...

    @Override
    public int compareTo(Game otherGame) {
        // 등급을 기준으로 비교하는 메서드 구현
        return Double.compare(this.rating, otherGame.rating);
    }
}

 

이 예제에서 Game 클래스는 Comparable 인터페이스를 구현하며, 객체를 등급에 기반하여 비교할 수 있게 합니다. compareTo 메서드는 현재 객체가 지정된 객체보다 작으면 음수, 같으면 0, 크면 양수를 반환합니다.

이제 List<Game>이 있고 이를 정렬하고 싶다고 가정해 봅시다. Collections.sort()를 사용하면 자동으로 Game 클래스에서 정의한 compareTo 메서드를 사용합니다.

List<Game> games = new ArrayList<>();
// 목록 채우기...

Collections.sort(games);

// 이제 'games'는 등급을 기준으로 정렬됩니다.

 

기본 자연 순서가 충분한 경우 유용합니다. 그러나 게임을 동적으로 이름 또는 다른 기준으로 정렬하려면 어떨까요?

여기에서 Comparator 인터페이스가 등장합니다.

import java.util.Comparator;

public class GameNameComparator implements Comparator<Game> {
    @Override
    public int compare(Game game1, Game game2) {
        // 게임 이름을 기준으로 비교하는 메서드 구현
        return game1.getName().compareTo(game2.getName());
    }
}

 

여기에서는 이름을 기준으로 Game 객체를 비교하는 특정 Comparator를 만들었습니다.

Comparator를 사용하려면:

List<Game> games = new ArrayList<>();
// 목록 채우기...

// GameNameComparator를 사용하여 이름으로 정렬
Collections.sort(games, new GameNameComparator());

 

이제 games 목록은 게임 이름을 기준으로 알파벳순으로 정렬됩니다.

주요 내용:

  • Comparable 인터페이스는 클래스 자체에서 구현되며 객체의 자연 순서를 정의합니다.
  • Comparator 인터페이스는 외부 비교 로직을 제공하여 다양한 기준으로 정렬할 수 있도록 합니다.

compareTo를 사용하여 자연 순서를 정의하고 Comparator를 사용하여 사용자 정의 순서를 정의하는 시점을 이해하면 더 유연하고 다양한 코드를 작성할 수 있습니다.

 

728x90