
자바 중급 문법 – 스트림 API – 2 – 스트림의 생성과 변환
소제목: 스트림의 개념과 생성 방법
스트림(Stream)은 자바 8부터 도입된 기능으로, 컬렉션(Collection)이나 배열 등의 데이터를 처리하는 간결하고 효율적인 방법을 제공합니다. 스트림을 사용하면 데이터를 일관성 있게 처리하고, 병렬 처리와 같은 성능 향상 기능도 제공받을 수 있습니다. 이번 소재에서는 스트림의 개념과 생성 방법에 대해 알아보겠습니다.
스트림이란?
스트림은 데이터 요소의 연속된 흐름을 나타내는 개념입니다. 비유적으로 설명하자면, 우리가 수도관에서 물을 받아오는 것과 비슷합니다. 수도관은 물이 흐르는 통로이고, 우리는 그 통로를 통해 물을 사용할 수 있습니다. 마찬가지로, 스트림은 데이터의 통로로서 데이터를 받아와서 원하는 작업을 수행할 수 있게 해줍니다.
스트림의 생성 방법
스트림은 다양한 방법으로 생성할 수 있습니다. 가장 일반적인 방법은 컬렉션(Collection)이나 배열(Array)을 기반으로 스트림을 생성하는 것입니다. 자바에서는 stream()
메서드를 통해 컬렉션의 요소들을 스트림으로 변환할 수 있습니다. 예를 들어, List 컬렉션에서 스트림을 생성하려면 다음과 같이 작성할 수 있습니다:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Stream<Integer> stream = numbers.stream();
또한, 배열을 기반으로 스트림을 생성할 수도 있습니다. 배열에서 스트림을 생성하려면 Arrays.stream()
메서드를 사용하면 됩니다. 예를 들어, 정수형 배열에서 스트림을 생성하는 방법은 다음과 같습니다:
int[] numbers = {1, 2, 3, 4, 5};
IntStream stream = Arrays.stream(numbers);
스트림을 직접 생성하는 방법도 있습니다. Stream.of()
메서드를 사용하여 주어진 요소들로 스트림을 생성할 수 있습니다. 예를 들어, 다음과 같이 스트림을 생성할 수 있습니다:
Stream<String> stream = Stream.of("Apple", "Banana", "Orange");
스트림의 변환 방법
스트림은 여러 가지 변환 작업을 수행할 수 있습니다. 이러한 변환 작업은 중간 연산과 최종 연산으로 나눌 수 있습니다. 중간 연산은 스트림의 요소를 변환하거나 필터링하는 작업을 수행하며, 최종 연산은 스트림의 요소를 소모하면서 결과를 도출하는 작업을 수행합니다.
중간 연산
중간 연산에는 다양한 연산자들이 존재합니다. 그 중에서도 많이 사용되는 연산자 몇 가지를 예시로 살펴보겠습니다.
-
filter
: 주어진 조건에 맞는 요소만을 필터링하여 새로운 스트림을 반환합니다. 예를 들어, 짝수만을 필터링하는 코드는 다음과 같습니다:List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Stream<Integer> evenNumbersStream = numbers.stream().filter(n -> n % 2 == 0);
-
map
: 각 요소를 주어진 함수에 따라 변환하여 새로운 스트림을 반환합니다. 예를 들어, 문자열의 길이를 반환하는 코드는 다음과 같습니다:List<String> words = Arrays.asList("Apple", "Banana", "Orange"); Stream<Integer> wordLengthsStream = words.stream().map(String::length);
최종 연산
최종 연산은 스트림의 요소를 소모하며, 결과를 도출합니다. 몇 가지 최종 연산의 예시를 살펴보겠습니다.
-
count
: 스트림의 요소 개수를 반환합니다. 예를 들어, 다음 코드는 리스트의 요소 개수를 세는 방법을 보여줍니다:List<String> fruits = Arrays.asList("Apple", "Banana", "Orange"); long count = fruits.stream().count(); System.out.println("과일 개수: " + count);
-
forEach
: 각 요소에 대해 주어진 동작을 수행합니다. 예를 들어, 다음 코드는 각 과일을 출력하는 방법을 보여줍니다:List<String> fruits = Arrays.asList("Apple", "Banana", "Orange"); fruits.stream().forEach(fruit -> System.out.println(fruit));
주의해야 할 점
스트림을 사용할 때 몇 가지 주의해야 할 점이 있습니다:
-
스트림은 일회용이므로 한 번 사용하면 재사용할 수 없습니다. 따라서, 필요한 경우에는 스트림을 다시 생성해야 합니다.
-
스트림 연산은 지연 평가(lazy evaluation)를 지원합니다. 즉, 최종 연산이 호출되기 전까지는 중간 연산이 실제로 수행되지 않습니다. 이는 성능 최적화에 도움이 되며, 필요한 연산만 수행할 수 있게 합니다.
-
스트림은 병렬 처리를 통해 성능을 향상시킬 수 있습니다. 병렬 스트림을 사용하면 멀티코어 프로세서를 활용하여 작업을 동시에 처리할 수 있습니다. 하지만, 적절한 상황에서만 사용해야 하며, 스레드 안전성에 주의해야 합니다.
스트림은 자바 프로그래밍에서 강력한 기능으로 사용되며, 데이터 처리를 효율적이고 간결하게 할 수 있도록 도와줍니다. 위에서 설명한 스트림의 개념, 생성 방법, 변환 방법에 대해 이해하고 활용하여 자바 프로그래밍을 더욱 효과적으로 수행할 수 있을 것입니다.
마무리
이번 포스트에서는 자바 중급 문법의 스트림 API에 대해 알아보았습니다. 스트림의 개념과 생성 방법, 중간 연산과 최종 연산에 대해 살펴보았습니다. 스트림은 데이터 처리를 효율적이고 간결하게 할 수 있는 강력한 도구이므로, 적재적소에 적절하게 사용해보세요.
하지만, 스트림을 사용할 때에는 몇 가지 주의사항을 염두에 두어야 합니다. 스트림은 일회용이므로 재사용할 수 없으며, 지연 평가와 병렬 처리에 유의해야 합니다.
자바 프로그래밍에서 스트림을 자유롭게 활용하면 코드의 가독성과 유지 보수성을 향상시킬 수 있습니다. 앞으로 공부하시는 분들에게도 스트림에 대한 이해와 활용법을 추천드리며, 자바 프로그래밍의 더욱 효율적인 학습을 기원합니다.