자바 스트림 개념정리

오정빈·2025년 10월 2일

내일배움캠프

목록 보기
15/22

2025 10 02 스파르타 코딩클럽 24일차

오늘 스트림 개념을 정리하면서 쓰레드와 헷갈리는 부분이 있어서 추가로 학습한 내용을 정리했다.

1. 쓰레드(Thread) 개념

  • 정의: CPU가 실제로 작업을 수행하는 최소 실행 단위.
  • 특징
    • 하나의 프로세스 안에 여러 개의 쓰레드 존재 가능 → 멀티쓰레딩
    • 각각의 쓰레드는 독립된 실행 흐름을 가짐
    • 동시성(Concurrency), 병렬성(Parallelism) 구현의 핵심

2. 스트림(Stream) 개념

  • 정의: 자바 8에서 도입된 데이터 처리 API
    (배열, 컬렉션의 요소를 필터링·매핑·집계 같은 연산을 SQL처럼 선언적으로 다룰 수 있음)
  • 특징
    • 원본 데이터 변경 X (불변성)
    • 중간 연산(filter, map 등)은 지연실행 → 최종 연산(collect, forEach 등) 시 수행
    • 내부 반복 (반복문 로직을 직접 안 짜도 됨)
    • 병렬 처리 지원 (parallelStream)

3. 스트림에서 단일 쓰레드 vs 멀티 쓰레드

(1) 단일 쓰레드 스트림 (stream())

  • 기본 스트림은 단일 쓰레드에서 순차 처리.
  • 내부적으로 하나의 쓰레드만 사용하므로 데이터는 입력 순서대로 처리됨.
  • 작은 데이터, 순서 중요한 경우 적합.
list.stream()
    .filter(x -> x > 10)
    .map(x -> x * 2)
    .forEach(System.out::println);

실행 순서: 한 쓰레드가 처음부터 끝까지 순차적으로


(2) 멀티 쓰레드 스트림 (parallelStream())

  • 내부적으로 ForkJoinPool (공용 스레드 풀, 기본적으로 CPU 코어 수만큼의 워커 스레드) 사용.
  • 데이터를 여러 조각으로 나누고 병렬로 처리한 후 최종적으로 합침.
  • 대량의 데이터 처리 시 성능 향상 가능.
  • 단, 작은 데이터에서는 오히려 성능 저하 (스레드 관리 오버헤드 때문).
  • 순서 보장이 필요하다면 forEachOrdered() 사용해야 함.
list.parallelStream()
    .filter(x -> x > 10)
    .map(x -> x * 2)
    .forEach(System.out::println); // 순서 보장 X

실행 순서: 여러 쓰레드가 동시에 조각을 나눠서 처리


최종 정리

  • 쓰레드(Thread) → CPU 실행 단위 (작은 범위, 저수준)
  • 스트림(Stream) → 데이터 처리 API (큰 범위, 고수준)
  • 단일 스트림(stream) → 순차 처리 (1개의 쓰레드)
  • 병렬 스트림(parallelStream) → 병렬 처리 (여러 쓰레드, ForkJoinPool 활용)

0개의 댓글