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);
실행 순서: 여러 쓰레드가 동시에 조각을 나눠서 처리
최종 정리
- 쓰레드(Thread) → CPU 실행 단위 (작은 범위, 저수준)
- 스트림(Stream) → 데이터 처리 API (큰 범위, 고수준)
- 단일 스트림(stream) → 순차 처리 (1개의 쓰레드)
- 병렬 스트림(parallelStream) → 병렬 처리 (여러 쓰레드, ForkJoinPool 활용)