포스트의 제목은 현재 읽고 있는 책인 "JAVA8 IN ACTION"의 첫 목차입니다.


"JAVA8 IN ACTION"에서 언급하는 프로그래밍 개념은 크게 세가지 정도로 보고 있습니다.


1. 스트림 처리 

- 이번 포스트에서 이야기 할것


2. 동작 파라미터화 

이곳을 참고 -> 2016/07/21 - [개발이야기/함수형 프로그래밍] - JAVA8 을 눈여겨봐야 하는 이유1 (메서드에 코드를 전달하는 기법)


3. 병렬성과 공유되는 가변 데이터

- 이번 포스트에서 이야기 할것


"JAVA8 을 눈여겨봐야 하는 이유 두번째 포스트" 로는 스트림 처리를 하려 합니다.


현재 보고 있는 책인 "JAVA8 IN ACTION" 에서는 스트림API에 대하여 "데이터베이스 질의 언어에서 표현식을 처리하는 병렬 연산을 지원하는 API" 라 정의하였습니다. 이는 고수준언어에서 어떠한 질의를 표현하면, 저수준에서 최적의 방법을 실행함을 의미합니다. (SQL 역시 질의어만 잘쓰면, 알아서 데이터를 빠르게 찾아주죠? ㅎㅎ)


일단 스트림에 대하여 알아봅시다.

스트림은 한번에 한개씩 만들어지는 연속적인 데이터 항목들의 모임입니다.

모든 일들은 이 스트림 단위로 끊어져 명령을 수행을 하는데,보통 유닉스에서는 파이프를 이용해 이를 연결하여 작업을 할 수 있습니다. 스트림API는 이러한 유닉스의 파이프라인을 메소드로 만들 수 있게 해주는 것이라 볼 수 있을 것 같습니다. (즉 메소드로 한층 감싸, 쉽게 파이프질을 할 수 있다 ㅡㅡ^)


그렇다면 병렬은?

일단 스트림 API를 사용하면 스레드를 사용하지 않고도 병렬성을 가질 수 있다고 합니다. "JAVA8 IN ACTION"에서는 공짜로 병렬성을 가진다는 표현을 쓰고 있습니다. stream의 처리 방식은 먼저 큰 stream 자체를 작은 stream 단계(즉 병렬이 가능한 단계)까지 분할하여 병렬적으로 처리합니다.) 아래 사진과 같이 말이죠. (JAVA8 IN ACTION에서 그림 참고)



즉 기존 collection 방식은 데이터를 어떻게 저장하고, 접근하는가에 중점을 두었다면 stream은 어떻게 데이터를 계산하는가에 중점을 두었다고 볼 수 있습니다. (즉 이러한 for문에 의한 외부반복 대신 필요 시점에 연산되는 내부반복을 통해, 거대한 데이터를 효과적으로 처리할 수 있게 되었습니다.)


스트림을 사용하기 위해서는 코드로 넘길 메소드는 동시 실행에 있어서 안전해야 합니다. 이 뜻은 메소드 자체에 상태가 없어, 실행에 있어서, thread-safe 함을 의미한다고 볼 수 있습니다. 즉 넘기는 메소드 내부에서 공유된 데이터 목록을 건드리면 문제가 있을 수 있겠죠? (예를 들어 덧셈을 하는데, 중간 녀석을 지운다던지...) 

이 것은 기존의 sychronized 라는 비싼 비용을 어느정도 대체해 줄 수 있을 것 같습니다.


Stream API에 대한 포스팅은 이 곳에서부터...




자바 8 인 액션
국내도서
저자 : 라울-게이브리얼 우르마(RAOUL-GABRIEL URMA),마리오 푸스코(MARIO FUSCO),앨런 마이크로프트(ALAN MYCROFT) / 우정은역
출판 : 한빛미디어 2015.04.01
상세보기






반응형
Posted by N'