WeeklyStudy / modern-java-in-action

Modern Java in Action Study
0 stars 0 forks source link

스트림과 컬렉션의 어떤 차이점이 있을까? #3

Open ddackkeun opened 1 year ago

ddackkeun commented 1 year ago

문제

자바8에서는 스트림을 통해 병렬화, 컬렉션 처리의 문제 등의 주제가 자주 나온다. 그렇다면 스트림과 컬렉션의 차이점은 어떤 차이점을 가지고 있을까?

관련 목차

참고자료

ddackkeun commented 1 year ago

답변

스트림(Stream)이란?

Java8에서 추가된 기능으로 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소

컬렉션(Collection)이란?

많은 데이터 요소를 효율적으로 관리하기 위한 자료구조를 말한다.

공통점

차이점

  | Collection | Stream -- | -- | -- 데이터 계산 시점 | 컬렉션 추가 전 계산 | 요청 시 요소를 계산하는 고정된 자료구조 탐색 요소 재탐색 | 같은 소스 여러 번 반복 처리 | 단 한번만 반복문 처리 데이터 반복 처리 방법 | 외부 반복 | 내부 반복
  1. 데이터 계산 시점
    • Collection
      • 현재 자료구조가 포함하는 모든 데이터를 메모리에 저장
      • 각 요소들은 포함되기 전에 계산이 완료되어야 한다.
      • 영화의 모든 프레임들이 미리 저장되어 있는 DVD 비유함
      • 적극적 생성
    • Stream
      • 요청할 때에만 요소를 계산하는 고정된 자료구조
      • 사용자가 요청하는 값만 Stream에서 추출한다.
      • 요청한 값만 가져온다는 점에서 특정 시점을 보는 스트리밍에 비유
      • 게으른 생성
  2. 탐색 요소 재탐색
    • Collection
      • 같은 소스에 대해서 여러 번 반복 처리 가능
    • Stream
      • 탐색된 스트림의 요소는 소비됨(반복의 일회성) ⇒ 다시 탐색 시 초기 데이터 소스에서 새로운 스트림 생성
  3. 데이터 반복 처리 방법
    • Collection

      • 외부 반복
        • 사용자가 for-each 통한 반복문을 직접 명시
        • 병렬 처리를 위한 스레드 간의 공유 자원 동기화 처리 필요
      List<String> names = new ArrayList<>();
      for(Student student : students) {
          names.add(student.getName());
      }
      
    • Stream

      • 내부 반복: 반복을 알아서 처리하고 결과를 Stream 값 어딘가에 저장하는 내부 반복 사용
        • 사용자 직접 반복자 필요 없음
        • 병렬 처리를 위한 스레드간의 공유 자원 동기화 필요 없어 병렬 처리의 이점 있음
      List<String> names = students.stream()
              .map(Student::getName()
              .collect(Collectors.toList());
      

참고자료