본문 바로가기
자바

[모던 자바 인 액션] 스트림이란

by __Minnie_ 2025. 4. 24.
스트림이란

 

스트림 API는 자바 8 API에 새로 추가된 기능으로, 이를 사용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 또한 스트림을 사용하면 멀티스레드 코드를 작성하지 않아도 데이터를 투명하게 병렬로 처리할 수 있다. 즉, 공짜로 병렬성을 얻을 수 있다. 스트림 API은 선언형, 조립할 수 있음, 병렬화라는 특징을 가지고 있다.

 

여기서 스트림이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소로 정의할 수 있다. 스트림에는 파이프라이닝과 내부 반복이라는 특징을 가진다. 파이프라이닝은 스트림 연산끼리 연결해서 커다란 파이프라인을 구성할 수 있는 것을 의미하고, 내부반복은 우리가 반복자를 명시적으로 사용하는 것과 달리 반복자의 사용 없이 스트림 내부에서 반복을 처리하는 것을 의미한다.

 

스트림 VS 컬렉션

 

스트림과 컬렉션은 모두 동일하게 연속된 요소 형식의 값을 저장하는 자료구조이다. 하지만, 둘은 데이터를 계산하는 시점에서 차이가 발생한다. 컬렉션은 자료구조가 포함하는 모든 값을 메모리에 저장하는 자료구조로 컬렉션의 모든 값을 컬렉션에 추가되기 전에 모두 계산이 되어야 한다(적극적 생성). 반면 스트림은 요청할 때만 요소를 계산하는 고정된 자료구조이다(게으른 생성). 

 

인터넷 영상을 보는 경우를 생각해보면, 만약 컬렉션처럼 모든 값을 다 로드한 후에 영상을 볼 수 있다면 영상을 보기 전에 우리는 아주 긴 시간을 기다려야 한다. 하지만 스트림은 요청할 때 요소를 제공하기 때문에 내가 시청하는 부분의 데이터만을 요청해서 보여주기 때문에 우리는 오래 기다지리 않아도 영상을 시청할 수 있게 된다. 

 

스트림의 특징

 

1. 한번만 탐색 가능

스트림의 데이터는 딱 한번만 탐색이 가능하다. 즉, 탐색한 스트림은 소비되어 다시 소비할 수 없다. 다시 탐색하고 싶다면 새로운 스트림을 다시 생성해야 한다. 

 

2. 외부 반복과 내부반복

우리가 일반적으로 반복자를 사용하여 요소를 반복시키는 것을 외부 반복이라고 한다. 내부 반복은 우리가 스트림API를 사용하면 내부적으로 알아서 반복을 처리해주고 결과를 반환해주는 것을 의미한다.

 

3. 중간 연산과 최종 연산

스트림에서 제공하는 기능은 중간연산과 최종연산으로 나뉜다. 중간 연산은 결과로 다른 스트림을 반환하는 것으로 다른 연산을 연결할 수 있는 연산을 의미한다.

 

최종 연산은 스트림 파이프라인에서 결과를 도출하는 것으로 스트림 이외의 결과값을 반환하는 연산을 의미한다. 

 

중간 연산은 선언을 하더라도 최종 연산을 하기 전까지 연산을 하지 않고 있다가, 최종 연산을 만나면 한번에 처리를 한다.