스트림이란

실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름으로 데이터의 흐름이라고 할 수 있고 자바에서는 이 데이터를 어떻게 다룰것인지를 논하는 일종의 파이프라인.

스트림을 크게 세 파트로 분류하면 생성, 가공, 소비로 분류함.

스트림 구조

생성

리스트, 맵과 같은 컬렉션으로부터 생성 가능
이외에도 배열로부터 생성 가능하고 또는 파일로부터 생성할 수도 있다.
별도의 서드파티 라이브러리로도 활용 가능

가공

중간연산자는 필터, 맵, 리밋등 소스로부터 얻어낸 값들을 이제 입맛대로 가공하는 역할을 한다.

스트림에서 lazy evaluation은 최종 연산이 들어오기 전까지 중간 연산은 실제로 실행되지 않음을 의미한다.

새로운 Stream instance를 돌려주기만 할 뿐 어떠한 작업도 하지 않는데, 이러한 lazy evaluation이 있기 때문에 loop-fusion과 short-circuit을 사용할 수 있다.

limit 연산을 사용하면 short-circuit이라는 기법을 사용할 수 있다. (모든 것을 iteration 하지 않고 일찍 끝난다.)
다른 연산이 한 과정으로 병합되는 것을 루프 퓨전(loop-fusion) 이라고 한다.

소비

주의점1 : 최종연산자가 수행되고 나면 스트림 파이프라인은 소비된 것으로 간주된다. 즉, 다시 사용하려면 새로운 스트림을 만들어야한다.
주의점2 : forEach는 대게 로그나 디버깅을 위한 출력으로만 사용할 것을 권장한다.
forEach내부에서 값을 할당하는 식으로 사용할 경우, 불필요한 사이드이펙트를 불러올 수 있다.

스트림의 장단점

장점 :
가독성이 좋다.(해당 코드가 어떤식으로 동작하는지 쉽게 이해할 수 있다.)
유연성이 있다.(코드의 변경이 쉽다.)
병렬처리를 간단하게 해결할 수 있다.
(parallel()이나 parallelStream()이라고 키워드를 붙여주면 병렬처리를 지원함.)

단점 :
컴퓨팅 비용이 많이 듦.(내부적으로 다양한 조건과 상황에 따라서 연산을 처리하기때문)
인지에 대한 비용(기존 반복문은 값을 꺼내와서 사용하는 반면, Stream은 Stream 내부에서 연산이 일어남. 문제는 코드가 정상적으로 동작하지 않을경우, 내부에서 어떤식으로 동작하는지 명확하게 파악하고 있어야 함.)

profile
문제 해결을 위해 끊임없이 파고드는 걸 좋아합니다.

0개의 댓글