프로그래밍 언어/Java

Stream이란? - 기본 개념과 특징 (JAVA)

제이온 (Jayon) 2021. 1. 5.

안녕하세요? 코딩중독입니다.

 

저번 시간에는 주요 함수적 인터페이스를 알아 보았는데, 오늘부터는 람다가 아닌 스트림에 대한 이야기를 하려고 합니다.

 

 

Stream이란?

스트림의 사전적 의미는 '흐르다' 또는 '개울'입니다. 프로그래밍에서의 스트림도 사전적 의미와 크게 다르지 않습니다. 다만, 여기서는 물이 흐르는 것은 아니고 '데이터의 흐름'을 말합니다.

 

뭔가 추상적으로는 대충 데이터가 흐르겠구나.. 싶은데 정확히 어떻게 흐르고 결과를 이용하는지 알기가 어렵습니다. 그래서 제가 이해를 돕기 위한 그림을 준비하였습니다.

 

 

 

 

위 그림은 어부가 물고기를 그물로 잡고, 여러 마리를 일정한 기준으로 모아서 상자에 넣고, 이들을 하나로 모은 뒤 트럭에 실어서 우리의 밥상(?)까지 운반하는 과정을 나타내고 있습니다.

 

stream도 이와 별반 다르지 않습니다. 물고기와 같은 어류의 이동을 stream이라고 정의할 수 있습니다.

 

먼저, 어부가 어류 중에서도 고등어를 잡고 싶어서 그물로 고등어를 잡았습니다. 이 행위를 filter라고 하고, 이 연산자를 중간 연산자라고 합니다.

 

그리고 고등어를 포장하지 않고 생으로 팔 수는 없기 때문에 상자에 담아야 합니다. 이 행위를 map이라고 하고, 이 연산자도 마찬가지로 중간 연산자라고 합니다.

 

마지막으로, 고등어가 실린 수많은 상자를 운반하여 다른 곳으로 이동하면서 끝이 납니다. 이 행위를 collect라고 하고, 이 연선자는 최종 연산자라고 합니다.

 

 

어떤가요, 이제 조금 감이 잡히지 않나요? 스트림은 수많은 데이터의 흐름 속에서 각각의 원하는 값을 가공하여 최종 소비자에게 제공하는 역할을 한다고 보면 되겠습니다.

 

 

Stream의 특징

위의 스트림을 이제 조금 딱딱하게 설명할 때가 왔습니다. 기능적인 측면에서 스트림은 컬렉션(배열 포함)의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자입니다.

 

우리는 사실 반복자를 스트림이 아니더라도 계속 사용해 왔습니다. 단적인 예로 Iterator 반복자가 있죠.

 

 

 

 

정수가 있는 리스트를 하나씩 순회하면서 값을 출력하는 단순한 코드입니다. 이제, 이를 스트림으로 바꿔 보겠습니다.

 

 

 

 

어떤가요? 무슨 말인지는 모르겠어도 코드가 확 간결해졌다는 것을 아실 수 있을겁니다. 사실 저기서도 굳이 Stream을 변수로 따로 빼지 않고 바로 출력을 해도 되지만, 스트림을 정의하는 방식 중 하나를 보여주려고 일부러 한 줄을 더 코딩하였습니다.

 

 

이제, 스트림의 특징이 무엇인지 알아 보겠습니다.

 

 

(1) 람다식으로 요소 처리 코드를 제공한다.

위의 코드에서 볼 수 있듯이, 스트림은 람다식 또는 메소드 참조를 이용합니다. 따라서, 코드가 간결해지는 장점이 있습니다.

 

 

(2) 내부 반복자를 사용하므로 병렬 처리가 쉽다.

외부 반복자란 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴을 말합니다. 우리가 흔히 사용하는 index를 이용한 반복문이나 Iterator를 사용한 while문은 모두 외부 반복자를 이용하는 것입니다. 반면, 내부 반복자는 컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소당 처리해야 할 코드만 제공하는 코드 패턴을 말합니다.

 

 

 

 

위의 그림은 외부 반복자와 내부 반복자를 나타낸 것입니다. 내부 반복자는 요소들의 변경 순서를 변경하거나, 멀티 코어 CPU를 최대한 활용하기 위해서 요소들을 분배시켜 병렬 작업을 할 수 있도록 도와 줍니다.

 

 

 

 

스트림은 람다식으로 요소 처리 내용만 전달할 뿐, 반복은 컬렉션 내부에서 일어납니다. 따라서, 요소의 병렬 처리가 컬렉션 내부에서 처리되므로 효율적인 병렬 처리가 가능합니다.

 

 

(3) 중간 처리와 최종 처리가 존재한다.

스트림은 컬렉션의 요소에 대해 중간 처리와 최종 처리를 수행할 수 있는데, 중간 처리에서는 매핑, 필터링, 정렬을 수행하고 최종 처리에서는 반복, 카운팅, 평균, 총합 등의 집계 처리를 수행합니다.

 

만약, 학생 객체를 요소로 가지는 컬렉션이 있다고 가정하면, 중간 처리에서 학생의 수학 점수를 뽑아 내고 최종 처리에서는 수학 점수의 평균값을 산출하는 행위를 할 수 있습니다.

 

 

정리

지금까지 스트림의 개념과 특징에 대해서 알아 보았습니다. 다음 시간에는 스트림의 종류와 스트림을 생성하는 다양한 방법에 대해서 살펴 봅시다.

 

 

참고 자료

 

Java Stream API

Stream API Java 8에서 추가된 기능으로, stream 형태의 요소에 함수형 연산자를 지원해주는 클래스이다. Stream stream은 Array, Collections와 같이 연속된 형태의 객체이다. 하지만 자료구조는 아니다. 위와

velog.io

 

 

[JAVA] Stream API 소개

스트림 소개 스트림(Stream)은 자바8부터 추가된 반복자이며, 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해준다. 반복자 스트림 자바 7 까지는 Iterator를 사용했지만, 자

cornswrold.tistory.com

 

이것이 자바다(저자 : 신용권)

댓글

추천 글