객체 비교 인터페이스 Comparator + 람다표현식

Yumin Jung·2024년 11월 27일
0

ABOUT 프로그래밍

목록 보기
14/15

백준 문제를 풀던 중, 한 번에 3가지의 개념 정리가 필요할 것으로 보아 블로그에 글을 작성한다.

Comparator 인터페이스

Comparator는 Java에서 객체 간 순서를 정의하는 데 사용되는 인터페이스. 주로 정렬 기준을 설정하기 위해 사용하며, Arrays.sort() 또는 Collections.sort()와 함께 많이 사용됨. Comparator는 비교 기준을 외부에서 설정할 수 있다는 점에서, 클래스 내부에 정렬 기준을 설정하는 Comparable과 다름.

Comparator 인터페이스는 다음과 같은 단일 메서드를 포함:

int compare(T o1, T o2);
  • o1o2는 비교할 두 객체.
  • compare() 메서드는 다음 값을 반환:
    • 음수: o1o2보다 작을 경우.
    • 0: o1o2가 같은 경우.
    • 양수: o1o2보다 클 경우.

예제: 2차원 배열의 특정 열 기준으로 정렬

익명 클래스를 사용해 Comparator를 구현하여 2차원 배열을 정렬하는 예시:

import java.util.Arrays;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        int[][] arr = {
            {5, 3},
            {2, 4},
            {2, 1},
            {4, 6},
            {5, 2}
        };

        // 첫 번째 열 기준으로 정렬하고, 같을 경우 두 번째 열 기준으로 정렬
        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            public int compare(int[] a, int[] b) {
                if (a[0] != b[0]) {
                    return Integer.compare(a[0], b[0]);
                }
                return Integer.compare(a[1], b[1]);
            }
        });

        // 정렬된 결과 출력
        for (int[] row : arr) {
            System.out.println(Arrays.toString(row));
        }
    }
}

위 예제에서 Arrays.sort() 메서드를 사용해 2차원 배열을 정렬하며, 각 행을 Comparator를 통해 비교. 첫 번째 열을 기준으로 비교하고, 같으면 두 번째 열을 기준으로 정렬.

람다 표현식

Java 8부터는 람다 표현식을 사용할 수 있음. 덕분에 Comparator와 같은 기능성 인터페이스를 더 간결하게 구현할 수 있음. 아래는 익명 클래스 예제를 람다 표현식으로 간소화한 것:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[][] arr = {
            {5, 3},
            {2, 4},
            {2, 1},
            {4, 6},
            {5, 2}
        };

        // 첫 번째 열 기준으로 정렬하고, 같으면 두 번째 열 기준으로 정렬 (람다 사용)
        Arrays.sort(arr, (a, b) -> {
            if (a[0] != b[0]) {
                return Integer.compare(a[0], b[0]);
            }
            return Integer.compare(a[1], b[1]);
        });

        // 정렬된 결과 출력
        for (int[] row : arr) {
            System.out.println(Arrays.toString(row));
        }
    }
}

위 람다 표현식은 두 배열(int[] a, int[] b)을 받아 첫 번째 값을 기준으로 비교하고, 같으면 두 번째 값을 비교. 익명 클래스보다 훨씬 간결하게 Comparator 구현 가능.

삼항 연산자로 한 줄로 표현

람다 표현식은 삼항 연산자를 사용해서 더 간단하게 작성할 수 있음:

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[][] arr = {
            {5, 3},
            {2, 4},
            {2, 1},
            {4, 6},
            {5, 2}
        };

        // 한 줄로 표현한 다중 조건 정렬 (삼항 연산자 사용)
        Arrays.sort(arr, (a, b) -> a[0] != b[0] ? Integer.compare(a[0], b[0]) : Integer.compare(a[1], b[1]));

        // 정렬된 결과 출력
        for (int[] row : arr) {
            System.out.println(Arrays.toString(row));
        }
    }
}

요약

  • Comparator 인터페이스: 두 객체 간 순서를 정의하기 위해 사용됨. compare() 메서드를 구현하여 커스텀 정렬 기준을 설정.
  • 익명 클래스 사용: Java 8 이전에는 주로 익명 클래스를 사용해 Comparator를 구현했음. 코드가 장황하고 반복적임.
  • 람다 표현식: Java 8 이후에는 Comparator를 더 간결하게 표현하기 위해 람다식을 사용함. 코드가 짧아지고 가독성이 향상됨.
  • 2차원 배열 정렬: Arrays.sort(arr, comparator)를 사용해 2차원 배열의 각 행을 정렬. compare(int[] a, int[] b)는 각 행을 비교하여 순서를 결정.

0개의 댓글

관련 채용 정보