티스토리 뷰

language/JAVA

Stream, 스트림

북항 2020. 5. 6. 03:28
donaricano-btn
반응형

자바8에 도입된 새로운 기능 중 스트림(Stream)이 있습니다. 스트림을 이용하면 선언형으로 기존의 컬렉션 데이터들을 처리할 수 있게 됩니다. 쉽게 생각하면 컬렉션 반복을 좀 더 효율적이고 간편하게 수행할 수 있는 방법이라고 볼 수 있습니다. 또한 데이터의 병렬 처리에도 용이한 장점이 있습니다. 

 

위 그림은 Stream을 이해하기 쉽게 표현한 그림입니다. 그림에서 물고기들은 어부들이 설치한 그물에 걸러지고 일정한 규격으로 포장된 뒤 소비자에게 전달됩니다.

 

자바에서 스트림은 위 그림의 흐름이라고 할 수 있습니다. 이런 흐름속을 헤엄쳐 다니는 물고기와 해양 생물들은 컬렉션 데이터라고 할 수 있겠죠. 데이터들은 스트림을 유영하다가 어부가 설치한 그물에 걸러지게 됩니다. 코드에서는 filter로 표현 되는 부분입니다. filter에 걸러진 데이터들은 이제 일정한 규격으로 포장이 되게 되는데 코드에서는 map으로 표현 됩니다. 그리고 마지막으로 소비자에게 배달 되는 것이 collect라고 할 수 있습니다.

 

강물의 물결이 한 번 흐르고 나면 다시 되돌아 올 수 없듯이 스트림 역시 한 번 만 소비할 수 있습니다.

 

스트림을 활용하게 되면 선언적으로 코드를 구현할 수 있기 때문에 일정부분 코드의 가독성이 올라갑니다. 또 filter, map, sorted, collect 등과 같은 다양한 빌딩 블록 연산을 통해 다양한 파이프라인을 구성할 수 있습니다. 그리고 이런 연산 블록들은 모두 병렬연산에 자유롭기 때문에 병렬화를 통해 성능을 향상시킬 수 있습니다.

 

컬렉션 vs 스트림

 

데이터를 언제 계산하는가?

  • 컬렉션
    • 현재 자료구조가 포함하는 모든 값을 메모리에 저장.
      즉, 컬렉션의 모든 요소는 컬렉션에 추가하기 전에 계산되야 한다.
    • 생산자 중심(Supplier-Driven). 즉, 팔기도 전에 창고를 가득 채우며 적극적으로 생산 한다.
  • 스트림
    • 요청할 때만 요소를 계산하는 고정된 자료구조.
      따라서 스트림에 요소를 추가/삭제가 불가하다.
    • 사용자가 요청하는 값만 스트림에서 추출.
      생산자(Producer)와 소비자(Consumer) 관계.
    • 게으르게 만들어지는 컬렉션과 같다.
      즉, 사용자가 데이터를 요청할 때만 값을 계산한다. (요청 중심 제조(Demand-Driven Manufacturing) or 즉석 제조(Just-In-Time Manufacturing))

데이터 소스를 반복 사용할 수 있는가?

  • 컬렉션
    • 데이터를 반복해서 사용 할 수 있다.
  • 스트림
    • 데이터를 단 한번만 소비할 수 있다.

외부반복과 내부반복

  • 컬렉션 : 외부반복 (External Iteration)
  • 스트림 : 내부반복 (Internal Iteration)
반응형
donaricano-btn
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함