숨숨 베이스

지식이 숨어있는 공간

Stream API

Last updated on December 18, 2025

1. 등장 배경

KEY WORD: 빅데이터 운용 필요성 커짐 -> 병렬 프로그래밍 역량이 필요함 -> Stream API 출시
IT 업계에서 빅데이터 처리 및 운용이 중요해지며, 기존 KB ~ GB 단위를 처리하던 프로그램은 TB 단위 데이터를 처리할 수 있도록 진화 해야만 했다. 이에 따라 멀티 코어 프로그래밍 이나, 컴퓨팅 클러스터링 과 같이 한 번에 많은 데이터를 처리할 수 있는 병렬 프로그래밍의 중요성이 커졌다.
하지만 Java 7 이전의 자바의 경우, 여전히 단일 코어 중심의 프로그래밍 언어였다.
JVM이 돌아가고 있는 컴퓨터가 아무리 멀티코어여도 그 중 하나만 사용하였으며 나머지는 유후 idle로 놔두거나, 운영체제 혹은 바이러스 검사 프로그램가 사용되도록 놔두었다. Java 또한 1.0 부터 7.0에 이르기까지 스레드를 활용한 다양한 병렬 프로그램 기법을 내놓았으나, 잠금, 동기화 등 저수준 동작을 모두 개발자가 관리해야 했기에 구현 및 관리가 복잡하고 오류에 취약하고 자주 활용되지 않았다.
사장될 수 없었던 자바는 Java8에서 Stream API 라는 병렬 프로그래밍 기법과 이를 보좌할 람다: 익명 함수, 인터페이스의 default 매소드 를 출시하며 Java의 병렬 프로그래밍 역량을 크게 끌어올렸다.

2. 정의

Stream'끊이지 않고 계속되다.' 라는 사전적 의미를 가진다. 이처럼 한 번에 한 개씩 만들어지는 연속적인 데이터들의 모임을 스트림이라 한다.
전개도로 나타내면 다음과 같다.
image.png
만약 stream 내부에서 문자 배열의 값들을 랜덤으로 섞기, 대문자 -> 소문자로 캐스팅, 문자 오름차순 정렬 의 과정을 전부 진행한다고 하자. stream API의 경우, 하나의 과정을 한 번에 처리하는 것이 아니라, 데이터마다 차례대로 모든 과정을 겪게 하여 전체 작업을 처리한다.
image.png
현재 같은 행끼리는 동일한 시간대에 일어나는 일인데, 이처럼 stream을 활용하면 하나의 작업이 병렬적으로 처리될 수 있는 환경을 구성할 수 있다.
⚠️ 주의점: stream 자체가 병렬을 지원하는 것은 아니다.
stream은 위처럼 병렬 처리 할 수 있는 가능성을 열어둔 것 뿐이며, 진짜 병렬 처리는 parallelstream을 활용해서 stream 내 작업이 서로 다른 CPU에 할당될 수 있도록 도와야 한다.
 
image.png
이제 이렇게 동시에 진행되어도 되는 일을 다른 CPU에 할당하면 병렬 처리가 가능해진다. Java에서는 기존 stream 대신 parallel stream을 활용하면 병렬 처리로 쓸 수 있다.
image.png
기존 명령형 프로그래밍의 경우, 하나의 작업을 끝내야만 다음 작업으로 넘어갈 수 있으므로, 병렬화 가능성이 사전에 막힌다.

3. 특징

  1. stream을 쓰면 병렬 처리가 쉬워진다. -> CPU 마다 작업 분할 배정이 쉬워지기 때문에
  1. 선언적 처리 모델로서 가독성을 높인다.

(1) 선언적 처리 모델

프로그래밍에서 선언적이란 표현은 '어떻게' 보다 '무엇을' 에 집중하여 내용을 작성하는 성질을 의미한다.
위에서 나왔던 대문자 -> 소문자 캐스팅 과정을 기존 모델과 선언적 모델에서 어떻게 처리하는지를 비교하여 추가 설명하겠다.

A. 기존 처리 모델

public static char [] castingLower(char [] prev){ char [] result = new char [prev.length]; for(int i = 0; i < result.length; i++){ result[i] = Character.toLowerCase(prev[i]); } return result; }
기존 처리 모델은 '무엇을' 보다는 '어떻게' 에 집중하고 있다. 위의 코드를 보면, 결과를 담을 result 배열을 만들고, 기존 배열에서 데이터 하나씩 소문자로 캐스팅 후 result에 집어넣는다. 이후 완성된 result를 반환한다.

B. Stream

map(Charracter::toLowerCase)
문자를 소문자로 매핑하겠다는 '무엇을' 만 적혀있다. 이러한 stream의 선언적 모델로서의 특징 덕에 stream을 활용하면 코드의 가독성을 높일 수 있다.

4. Stream이 부가적으로 야기한 기능들

이러한 Stream이 자바 8에서 신규로 편입되며, 야기한 기능 두가지가 있다.
  1. ☁️
    동작의 파라미터화

    -> stream 내부에서 세부 동작을 커스텀해서 제어하기 위해 필요
  1. 인터페이스의 default 매서드
    -> stream API를 기존 Collections 인터페이스에 추가하려고 하는데, 호환성이 문제되어서 이를 고치고 추가

⬅️ 이전 글