본문 바로가기
야미스터디/Java

[Java - Stream] 02. 컬렉션과 Stream의 구현방식의 차이

by 의정부핵꿀밤 2022. 12. 7.
728x90

[Reference]

https://tecoble.techcourse.co.kr/post/2021-05-23-stream-api-basic/

 

StreamAPI 나도 한 번 써보자!

Java 의 Stream API 사용 방법을 알아보자. 우아한테크코스 프리코스 과정에서 Stream API 를 사용해서 코드를 맛깔나게 구현하는 분들을 보면 괜스레 해야 할 것 같고, 유용해 보여서 흥미가 생긴다.

tecoble.techcourse.co.kr

https://tecoble.techcourse.co.kr/post/2020-05-14-foreach-vs-forloop/

 

Stream의 foreach 와 for-loop 는 다르다.

Stream에 대한 기본적인 학습을 위해 찾아왔다면, 공식 오라클 문서를 참고하면 좋을 것 같다. (java8 부터는 Stream과 Lambda를 제공한다.) 자바에서 Stream…

tecoble.techcourse.co.kr

https://tecoble.techcourse.co.kr/post/2020-09-30-collection-stream-for-each/

 

Collection.forEach와 Stream.forEach는 뭐가 다를까?

자바 반복문 알고 쓰자! 를 작성하다가 궁금해진 내용이다. 아래처럼 Collection.forEach 메서드로 반복할 때와 Stream.forEach…

tecoble.techcourse.co.kr


Intro

컬렉션의 경우 반복문과 조건문으로 데이터를 처리하게 되고, 이는 클라이언트 코드를 작성하는 개발자마다 구현 방식이 달라질 수 있다.

스트림의 동작 방식은 라이브러리 API 내부 반복을 지원하여 연산을 추상화한다.

 

 

 

데이터 처리 방식 살펴보기

컬렉션으로 데이터를 처리하는 방식에서는 데이터를 어떻게 저장하고 처리할지에 중점을 둔다.

반면 스트림은 데이터에 어떤 연산을 할 것인지 묘사하는 것에 중점을 둔다.

 

외부적으로 처리되는 Collection의 동작 방식

  • 위는 컬렉션을 활용하여 데이터를 처리하는 방식을 도식화한 내용이다.
  • 관리하기 위한 데이터를 컬렉션(자료구조)에 적재해놓은 뒤, 개발자가 구현한 로직을 통해 각각의 요소에 접근 및 처리하여 결과값을 클라이언트 코드에 응답하게 된다.
  • 이와 같이 구성하기 위해서는 데이터가 어떤 컬렉션에 저장하는 것이 적합할 것인지 선택 및 저장해야 하고, 각 요소별 조회/처리 시에 필요한 방어 코드 또한 필요하다.

 

 

내부적으로 처리되는 Stream의 동작 방식

  • 위는 스트림 API를 활용하여 데이터를 처리하는 방식에 대해 도식화 한 내용이다.
  • Stream은 내부적으로 데이터를 처리하므로 중간 연산을 통해 처리된 결과 값을 클라이언트에서 확인할 수 있다.

 

 

 

최종적으로 처리되는 데이터

  • 결국에는 위 2가지 방식 모두 위의 그림처럼 동작한다.
  • 의도는 필터링 이후에 특정 필드 값으로 그룹핑하여 결과 리스트를 반환하게 된다.

 

 

 

스트림 이용하는 방법

- 이전 강의에서 특정 상황을 가정하여 반복문과 스트림으로 구현된 코드를 작성하여 차이를 비교해봤고, 2가지 작성 방식은 달랐지만 최종 결과 값이 동일한 것은 확인하였다.

- 이러한 스트림을 잘 사용하기 위해서는 Stream 문법의 구조를 먼저 살펴봐야 한다.

- 크게는 3단계 구조로 볼 수 있다.

  1. 질의를 수행할 데이터 소스
  2. 스트림의 파이프라인을 구성할 중간 연산 연결
  3. 스트림 파이프라인을 실행하고 결과를 만들 최종 연산

 

  • 스트림 API는 데이터 소스를 시작으로, 순차적으로 중간 연산, 최종 연산을 연결하여 파이프라인이라 하는데 이는 빌더 패턴과 비슷하다.
  • 스트림에서 제공하는 연산을 살펴보기 위해서는 데이터 처리 질의(query)를 표현하는데 사용할 수 있는 필터링, 슬라이싱, 검색, 매칭, 리듀싱 등 다양한 패턴이 존재한다.

 

public class ChickenReport {  
   private final List<Chicken> chickens;  
   
   public ChickenReportV2(List<Chicken> chickens) {  
      this.chickens = chickens;  
   }  
   
   public Map<ChickenBrand, List<Chicken>> singleSizeReport() {  
      return this.chickens.stream()  // 데이터 소스
         .filter(ChickenReportV2::isSinglePrice)  // 중간연산(필터링)
         .collect(groupingBy(Chicken::getBrand)); // 결과를 반환하는 최종연산
   }  
   private static boolean isSinglePrice(Chicken chicken) {  
      return chicken.getPrice() <= 12_000;  
   }  
}

지금까지 자바 8이상에서 사용할 수 있는 stream에 대해서 살펴보았다.

  • 컬렉션보다 스트림을 사용함으로써 얻을 수 있는 장점
  • 스트림의 동작방식
  • 스트림을 사용하는 수준에서 활용하는 수준으로 올라가기 위해서 알아야 하는 API들
728x90

댓글