List.toArray

List를 배열로 변환합니다. 객체 배열은 직접 변환 가능하지만, 원시 타입(int[])으로 변환은 한 단계 더 필요합니다.

시그니처

Object[] toArray()                    // Object[] 반환
<T> T[] toArray(T[] a)                // 지정한 타입 배열 반환
<T> T[] toArray(IntFunction<T[]> f)   // 생성자 함수 (Java 11+)

동작 추적

List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
[ 초기 상태 ]
list: [a, b, c]

Object[] 반환 (캐스팅 필요 — 비추천)

Object[] arr = list.toArray();
// arr: [a, b, c]   (타입은 Object[])
[ 문제점 ]
String[]으로 캐스팅 못 함:
String[] strs = (String[]) list.toArray();   // ClassCastException

지정한 타입 배열 (권장)

String[] arr = list.toArray(new String[0]);
// arr: [a, b, c]   (타입은 String[])
[ 동작 ]
new String[0]을 던지면 → toArray 내부에서 적절한 크기의 String[] 생성

참고: new String[list.size()]를 미리 만들어 줘도 되지만,
     벤치마크상 new String[0]이 약간 더 빠름 (JIT 최적화)

생성자 함수 (Java 11+)

String[] arr = list.toArray(String[]::new);
// arr: [a, b, c]

가장 깔끔한 방법. Java 11+에서는 이걸 추천.

X 원시 타입 배열의 함정

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));

// X int[]로 직접 변환 안 됨
int[] arr = list.toArray();   // 컴파일 에러
int[] arr = list.toArray(new int[0]);   // 컴파일 에러

// 가능한 건 Integer[]만
Integer[] arr = list.toArray(new Integer[0]);
Integer[] arr = list.toArray(Integer[]::new);

O List → int[] 변환 방법

방법 1: Stream

List<Integer> list = Arrays.asList(1, 2, 3);

int[] arr = list.stream()
    .mapToInt(Integer::intValue)
    .toArray();
// arr: [1, 2, 3]
[ 동작 ]
Stream<Integer> → IntStream (언박싱) → int[]

방법 2: 수동 루프

int[] arr = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
    arr[i] = list.get(i);   // Integer → int 자동 언박싱
}

짧은 코드가 필요하면 Stream, 명시적이고 빠른 게 필요하면 루프.

자주 쓰는 패턴

결과 누적 후 배열 반환

public int[] solution(int[] arr) {
    ArrayList<Integer> list = new ArrayList<>();
    int lastValue = -1;

    for (int num : arr) {
        if (num != lastValue) {
            list.add(num);
            lastValue = num;
        }
    }

    // List → int[] 변환
    return list.stream().mapToInt(Integer::intValue).toArray();
}
[ 추적 ]
입력 arr:    [1, 1, 3, 3, 0, 1, 1]
누적 list:   [1, 3, 0, 1]
toArray:     [1, 3, 0, 1]   ← int[]로 변환됨

객체 List → 객체 배열

List<String> list = ...;
String[] arr = list.toArray(String[]::new);   // Java 11+
// or
String[] arr = list.toArray(new String[0]);

흔한 실수

new int[] 못 던짐

// X 컴파일 에러 — toArray의 타입 매개변수는 객체만
list.toArray(new int[0]);

// O Stream 사용
list.stream().mapToInt(Integer::intValue).toArray();

Object[] 캐스팅

List<String> list = ...;

// X ClassCastException
String[] arr = (String[]) list.toArray();

// O 타입 매개변수로 지정
String[] arr = list.toArray(new String[0]);

시간복잡도

연산복잡도
toArray()O(n)
toArray(T[])O(n)
Stream mapToInt(...).toArray()O(n)

CSLOG에서 보기