Java의 Stream.toArray() 메서드는 스트림의 요소를 배열로 변환하는 데 사용됩니다. 변환할 배열의 타입을 지정하기 위해 메서드 참조 또는 람다식을 사용합니다. 이를 단계적으로 살펴보겠습니다.
1. 기본 사용법
toArray()는 두 가지 방식으로 사용할 수 있습니다.
(1) 기본 배열 반환 (Object[])
스트림의 모든 요소를 Object 배열로 변환합니다.
Stream<String> stream = Stream.of("A", "B", "C");
Object[] array = stream.toArray();
System.out.println(Arrays.toString(array)); // 출력: [A, B, C]
이 방법은 간단하지만, 반환되는 배열 타입이 Object[]로 고정되므로 타입 캐스팅이 필요할 수 있습니다.
(2) 지정한 타입의 배열로 반환
toArray()는 배열 생성기를 인자로 받아, 원하는 타입의 배열로 반환할 수 있습니다.
여기서 String[]::new는 배열 생성기로, 필요한 크기의 배열을 생성합니다.
Stream<String> stream = Stream.of("A", "B", "C");
String[] array = stream.toArray(String[]::new); // String 타입 배열 생성
System.out.println(Arrays.toString(array)); // 출력: [A, B, C]
2. 2D 배열로 변환하기
toArray()를 활용하여 2D 배열을 생성할 수도 있습니다. 예를 들어, Set<int[]>를 int[][]로 변환할 때:
Set<int[]> set = new HashSet<>();
set.add(new int[]{1, 2, 3});
set.add(new int[]{4, 5, 6});
int[][] result = set.stream().toArray(int[][]::new); // 2D 배열 생성기 사용
작동 방식
- set.stream():
- Set<int[]>를 스트림으로 변환합니다.
- toArray(int[][]::new):
- 스트림의 모든 요소를 int[][] 타입의 배열로 변환합니다.
- int[][]::new는 필요한 크기의 2D 배열을 생성하는 역할을 합니다.
3. 메서드 참조 (::)
int[][]::new는 메서드 참조로 배열 생성기를 표현한 것입니다.
동작 설명
- int[][]::new는 스트림의 요소 개수를 인자로 받아, 해당 크기의 int[][] 배열을 생성합니다.
- 생성된 배열에 스트림의 요소가 복사됩니다.
동일한 작업을 람다식으로도 표현할 수 있습니다:
int[][] result = set.stream().toArray(size -> new int[size][]);
4. 예제: 다양한 배열 변환
import java.util.*;
import java.util.stream.*;
public class StreamToArrayExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("Java", "Stream", "API");
// (1) 기본 Object 배열
Object[] objectArray = list.stream().toArray();
System.out.println(Arrays.toString(objectArray)); // [Java, Stream, API]
// (2) 지정한 타입의 배열
String[] stringArray = list.stream().toArray(String[]::new);
System.out.println(Arrays.toString(stringArray)); // [Java, Stream, API]
// (3) 2D 배열 생성
Set<int[]> set = new HashSet<>();
set.add(new int[]{1, 2, 3});
set.add(new int[]{4, 5, 6});
int[][] int2DArray = set.stream().toArray(int[][]::new);
System.out.println(Arrays.deepToString(int2DArray)); // [[1, 2, 3], [4, 5, 6]]
}
}
5. 요약
- Stream.toArray()는 스트림 데이터를 배열로 변환하는 메서드입니다.
- 기본적으로 Object[] 배열을 반환하지만, 배열 생성기를 통해 원하는 타입의 배열로 변환할 수 있습니다.
- toArray(int[][]::new)는 스트림의 요소를 int[][] 타입의 배열로 변환하는 효율적인 방법입니다.
이 메서드는 타입 안정성과 가독성을 동시에 제공합니다.