본문 바로가기
Programming Language/Java

[Java] Primitive Array에 내림차순 정렬이 없는 이유

by kimyoungrok 2025. 2. 16.
728x90

목차

  • 왜 원시 배열은 내림차순 정렬을 지원하지 않을까?
  • 원시 배열을 내림차순 정렬하는 방법
  • 정리
  • 예제 코드

자바에서는 Arrays.sort() 를 사용해 원시(Primitive) 배열을 쉽게 정렬할 수 있습니다. 하지만 원시 타입 배열에 대해 내림차순 정렬은 지원되지 않습니다.

이 글에서는 원시 배열에 내림차순 정렬이 지원되지 않는 이유와, 이를 해결할 수 있는 대안에 대해 알아보겠습니다.


1️⃣ 왜 원시 배열은 내림차순 정렬을 지원하지 않을까?

원시 배열은 기본적으로 객체가 아니기 때문에 Comparator를 사용할 수 없습니다.

Arrays.sort()는 원시 타입 배열에 대해 Comparator를 지원하지 않으므로, 정렬 순서를 커스터마이즈할 수 없습니다. 반면, 객체 타입 배열(Integer[], Double[] 등)은 Comparator를 사용하여 내림차순 정렬을 할 수 있습니다.


2️⃣ 원시 배열을 내림차순 정렬하는 방법

1. 오름차순 정렬 후 배열 뒤집기

가장 단순한 방법은 Arrays.sort()로 원시 배열을 오름차순 정렬 후 배열된 정렬을 역순으로 뒤집는 방법입니다.

package pl.java.D250215;

import java.util.Arrays;

public class SortPrimitiveArrayReverse1 {
    public static void main(String[] args) {
        int[] primitiveArray = {9, 2, 1, 5, 7};
        Arrays.sort(primitiveArray);

        for (int i = 0; i < primitiveArray.length / 2; ++i) {
            int temp = primitiveArray[i];
            primitiveArray[i] = primitiveArray[primitiveArray.length - 1 - i];
            primitiveArray[primitiveArray.length - 1 - i] = temp;
        }
        
        System.out.println(Arrays.toString(primitiveArray));
    }
}

/*
[9, 7, 5, 2, 1]
*/

2. 객체 배열로 변환 후 정렬

원시 타입 배열을 객체 타입 배열로 변환한 후 Arrays.sort()와 Collections.reverseOrder()를 사용하여 내림차순 정렬을 할 수 있습니다.

package pl.java.D250215;

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

public class SortPrimitiveArrayReverse2 {
    public static void main(String[] args) {
        int[] primitiveArray = {9, 2, 1, 5, 7};

        Integer[] objectArray = Arrays.stream(primitiveArray).boxed().toArray(Integer[]::new);
        Arrays.sort(objectArray, Comparator.reverseOrder());

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

원시 배열에 대한 정렬이 아닌, 객체 배열에 대한 정렬이므로 람다식 표현을 사용한 내림차순 정렬도 가능합니다.

Arrays.sort(objectArray, (a, b) -> b - a);

만약 내림차순 정렬된 원시 배열이 필요하다면 다음과 같이 해결할 수 있습니다.

int[] descSortedPrimitiveArray = Arrays.stream(primitiveArray).boxed().
                sorted(Comparator.reverseOrder()).mapToInt(Integer::intValue).toArray();

🔥 정리

원시 배열은 객체 타입이 아니기 때문에(목적에 맞는 성능)을 위해 내림차순 정렬을 기본적으로 지원하지 않습니다.

하지만 기본 정렬(오름차순 정렬) 후 배열을 뒤집거나 스트림을 사용해 객체 배열로 변환 후 내림차순 정렬을 구현할 수 있습니다.

 


예제 코드

tech-blog-code/pl/java/D250215 at main · rogi-rogi/tech-blog-code

728x90