코딩테스트/자바 스터디

[Java] 람다(Lambda)를 활용한 커스텀 정렬 이해하기

승요나라 2025. 4. 25. 01:25

왜 커스텀 정렬이 필요할까?

Java에서 Arrays.sort()나 Collections.sort()를 사용하면 기본적으로 오름차순 정렬이 된다.

내림차순 정렬은 Arrays.sort(배열, Collections.reverseOrder()); 와 같이 사용한다.

(단, sort()에 Collections.reverseOrder()를 인자로 전달하기 위해서 배열은 int[]가 아닌 Integer[]처럼 래퍼클래스여야 함)

Arrays.sort(배열); // 오름차순 (default)
Arrays.sort(배열, Collections.reverseOrder()); // 내림차순


하지만 코딩테스트에서는 종종 특정 조건에 따라 정렬해야 할 상황이 생긴다.

  • 문자열 길이 기준 정렬
  • 객체의 점수 기준 내림차순 정렬
  • 두 가지 조건(점수 → 이름 순)으로 정렬 등등…

이럴 때는 람다식을 이용한 커스텀 정렬이 유용하게 쓰일 수 있다.

 

 

 

기본 문법

Arrays.sort(배열, (a, b) -> 비교 로직);

 

  • a와 b는 배열 속 두 원소이다.
  • 반환값이
    • 음수면 a가 b보다 앞에
    • 0이면 순서 유지
    • 양수면 b가 a보다 앞에

 

 


자주 쓰는 커스텀 정렬 포맷

정렬 기준 람다 표현식
오름차순 정렬 (a, b) -> a - b
내림차순 정렬 (a, b) -> b - a
문자열 길이 정렬 (a, b) -> a.length() - b.length()
객체 필드 정렬 (a, b) -> a.score - b.score 등
여러 조건 정렬 (a, b) -> 조건1 != 조건2 ? 조건1 : 조건2

 

 

 

예제 1: 문자열 배열을 길이 순으로 정렬하기

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] words = {"banana", "kiwi", "apple", "fig"};

        Arrays.sort(words, (a, b) -> a.length() - b.length());

        System.out.println(Arrays.toString(words));
    }
}

 

// 결과
[fig, kiwi, apple, banana]

 

 

 

예제 2: 객체 배열을 점수 기준으로 내림차순 정렬하기

import java.util.Arrays;

class Student {
    String name;
    int score;

    Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    public String toString() {
        return name + "(" + score + ")";
    }
}

public class Main {
    public static void main(String[] args) {
        Student[] students = {
            new Student("철수", 85),
            new Student("영희", 92),
            new Student("민수", 75)
        };

        Arrays.sort(students, (a, b) -> b.score - a.score); // 내림차순

        System.out.println(Arrays.toString(students));
    }
}
// 결과
[영희(92), 철수(85), 민수(75)]

 

 

 

예제 3: 두 조건으로 정렬 (점수 내림차순 → 이름 오름차순)

Arrays.sort(students, (a, b) -> {
    if (b.score != a.score) return b.score - a.score; // 점수 내림차순
    return a.name.compareTo(b.name); // 이름 오름차순 (점수가 같을 때만)
});

 

 

 

 

 

익명 클래스 vs 람다식

// 람다 없이 쓰면 이렇게 복잡해짐
Arrays.sort(words, new Comparator<String>() {
    public int compare(String a, String b) {
        return a.length() - b.length();
    }
});
// 람다를 쓰면 한 줄로 끝
Arrays.sort(words, (a, b) -> a.length() - b.length());
  • Java 8 이상부터 람다를 사용할 수 있으며, 복잡한 조건일수록 가독성을 위해 따로 Comparator를 정의하거나 메서드 참조를 사용하는 것도 좋다.