언어/Java
Java Stream의 개념
alpacadabra
2024. 11. 29. 15:20
Java Stream이란?
데이터 처리 방식을 파이프라인으로 추상화하여 작업 효율성을 높여주는 API.
스트림이라는 단어에서 알 수 있듯, 데이터가 파이프라인을 따라 흐르며 처리되는 모습을 떠올리면 쉽다.
파이프라인 내에는 다수의 연산이 존재할 수 있다. 그리고 각 연산은 함수형으로써 기존의 반복문-조건문의 혼합 연산을 축약할 수 있다.
파이프라인의 구성
파이프라인의 연산은 중단(Intermediate)과 종단(Terminal)의 두 단계로 나뉘어진다.
중단과 종단은 연산의 반환값이 스트림인지 아닌지에 따라 구분할 수 있다.
중단 연산은 스트림을 변환-반환하여 다음 연산의 메서드 체이닝이 가능토록 한다. 이에 연산의 연쇄가 파이프라인의 모습을 띠게 된다.
반면에 종단 연산은 스트림을 소비하여 결과를 반환하므로 더 이상의 체이닝이 불가능한, 명확한 종단점이 된다.
특징
- 재사용 불가 : 한번 사용한 스트림은 재사용할 수 없다. 동일한 스트림을 원한다면 동일한 소스에서 다시 스트림을 추출해야 한다. 참고로 소스의 데이터는 파이프라인을 거쳐도 변경되지 않는다.
- 무상태(Stateless) : 대부분의 중단 연산은 Stateless한 특성을 가지고 있다. Stateless는 스트림 내의 요소를 처리함에 있어서 개별적이고 독립적임을 의미한다.
- 병렬성(Parallelism) : 독립적인 연산은 병렬성 또한 가질 수 있다.
- 지연 평가(Lazy Evaluation) : 스트림 연산을 선언하더라도 이를 즉시 실행하는 것이 아니라, JVM의 최적화를 통해 "필요한 순간에" 수행하도록 한다.
- 최적화(Optimization) : 원활한 Lazy Evaluation을 위해 "필요한 계산만을", "최적의 순서로" 수행하도록 한다. 이때 "필요한 계산"은 Short-circuit으로, "최적의 순서"는 Loop optimization으로 대표된다.