개발/JAVA

[JAVA] 스트림과 병렬처리

mabb 2022. 5. 19. 10:53
반응형

 안녕하세요. 삶의 질을 높이고자 노력하는 영차영차입니다.
자바 기본기를 탄탄히 다지기 위한 공부 목적 포스팅입니다.
이것이자바다, HeadFirstJava 등의 교재와 구글링을 토대로 본인의 이해를 위해 작성하였으며
계속해서 살을 붙여나갈 계획입니다.
틀린 부분이 있을 경우 댓글 남겨주시면 감사하겠습니다.
---------------------------------------------------------------------------------------------------------

WHY
-내부 반복자 스트림을 사용하면 개발자는 요소 처리에만 집중할 수 있다.
-스트림을 사용하면 병렬처리가 쉽다.
-프로그래머스를 스트림으로 멋있게 풀 수 있다.

List의 메소드에는
iterator()와 stream()이 있다.
각각 Iterator 객체와 Stream객체를 반환하는 메소드.

자바 8 전까지는 
Iterator 반복자를 이용하여  반복적인 순차처리를 하였음.
Iterator는 StringTokenizer처럼 hasNext()메소드로 값이 있는지 확인하고
next()로 값을 가져오는 식으로 사용한다.
그리고 가져온 값을 가지고 개발자가 필요한 작업(요소 처리)를 진행한다.
for문으로 반복하며 요소처리를 하는 것과 같다.

외부반복자 : for문, Iterator
내부반복자 : Stream

Stream은 내부적으로 반복을 수행하며 중간처리, 최종처리를 통해 아주 편리하게 요소에 대한 처리를 할 수 있다. 병렬처리도 쉽게 이용할 수 있어서 좋다.(parallelStream으로 객체를 얻으면 병렬처리로 이용 가능)

name과 gender와 age를 필드값으로 가지는 Member타입의 ArrayList인
ArrayList<Member> memberList가 있다고 하고 남자 멤버들의 평균나이를 계산한다면

이클립스 실행화면

결과값은 같지만 스트림의 코드가 훨씬 간결하다. 그런데 여기서 중복제거라든가, 뽑아낸 값을 가지고 새로운 Map컬렉션을 만든다든가 하는 작업을 한다면 for문이나 Iterator의 코드는 더 복잡해질 것이다. 하지만 Stream은 메소드만 추가해주면 편리하게 그러한 기능들을 해낼 수 있다.
그렇다면 이렇게 편리한 스트림은 어디에서 얻을까?

 

스트림 구현 객체를 얻는 방법

컬렉션,  배열, int범위, long범위, 디렉토리, 파일 , 랜덤값

1. List와 Set 타입의 컬렉션에서 스트림 구현객체를 얻을 수 있다
2. 배열을 통해 얻을 수 있다.
  1) Arrays.stream 정적메소드를 이용하여 얻을 수 있다.
  2) Stream.of 메소드를 통해 얻을 수 있다. IntStream.of() 등
3. int범위를  통해 얻을 수 있다. IntStream.range() , IntStream.rangeClosed()
4. long범위를 통해 얻을 수 있다. LongStream.range(), LongStream.rangeClosed()
5. Files.find()  , Files.list() 메소드를 통해 경로를 요소로 가지는 스트림을 얻는다.
6. 파일 안에 있는 내용을 통해 스트림을 얻을 수 있다.
  Files.lines() , BufferdReader.lines()
7.랜덤 Random.doubles() , Random.ints() 등으로 랜덤 스트림을 얻을 수 있다.

 

스트림을 사용하려면

1. 스트림 객체를 얻어낼 수 있어야 한다.
2. 람다식, 메소드 참조를 이해하고 쓸 수 있어야 한다.
3. 스트림의 중간처리, 최종처리 메소드를 이해하고 사용할 수 있어야 한다.
4. 병렬처리(멀티쓰레드)에 대해 이해를 하고 있어야 한다.

아직 스트림의 메소드와 함수적 인터페이스들을 능숙하게 사용할 정도로 알지는 못하므로 틈틈이 공부하자.

 

java.util.function (Java SE 18 & JDK 18)

package java.util.function Functional interfaces provide target types for lambda expressions and method references. Each functional interface has a single abstract method, called the functional method for that functional interface, to which the lambda expr

docs.oracle.com

 

 

 

Stream (Java SE 18 & JDK 18)

Type Parameters: T - the type of the stream elements All Superinterfaces: AutoCloseable, BaseStream > A sequence of elements supporting sequential and parallel aggregate operations. The following example illustrates an aggregate operation using Stream and

docs.oracle.com

 

병렬처리란

멀티코어 CPU환경에서 하나의 작업을 분할해서 각각의 코어가 병렬적으로 처리하는 것. ->처리시간의 단축

동시성(Concurrency) : 하나의 코어에서 번갈아 작업을 수행하는 것.

병렬성(Parallelism) :여러개의 코어에서 각각 실제로 동시에 작업을 수행하는 것.

 

데이터 병렬성 : 하나의 작업을 서브 데이터로 나누어 병렬로 처리하는 것.

작업 병렬성 : 서로 다른 여러개의 작업을 병렬적으로 처리하는 것.
                          작업 병렬성의 대표적인 예는 웹 서버이다.

반응형

'개발 > JAVA' 카테고리의 다른 글

[JAVA] 싱글톤  (1) 2022.06.21
[JAVA] 다형성  (3) 2022.05.23
[JAVA] 멀티스레드  (0) 2022.05.19
[JAVA] 람다식  (0) 2022.05.19
[JAVA] 제네릭  (0) 2022.05.19