Stream
- Java 8에서 도입된 데이터 처리 추상화 API
- 컬렉션, 배열, 파일 등의 데이터 소스를 선언적이고 함수형 프로그래밍 스타일로 처리
- 데이터의 흐름(flow)을 처리하는 데 중점
- 데이터를 직접 저장하지 않음
- 데이터를 읽어 필요한 연산을 수행
- 연산이 데이터에 적용되지 않으며, 새로운 데이터 흐름을 생성
- 선언형 접근: 데이터 처리 과정을 간단하고 직관적으로 표현.
- 함수형 프로그래밍 지원: 람다 표현식과 잘 어울림.
- 원본 데이터 불변성 유지: 데이터를 안전하게 처리 가능.
- Lazy Evaluation: 성능 최적화 가능.
- 단일 소비: 한 번 사용된 Stream은 재사용 불가.
Stream의 중간 연산은 실제로 결과를 즉시 반환하지 않습니다. 대신 최종 연산이 호출될 때 모든 중간 연산이 한 번에 처리됩니다. 이를 통해 불필요한 연산을 줄이고 성능을 최적화할 수 있습니다.

특징
Stream은 데이터를 처리할 때 "어떻게(how)"가 아닌, "무엇(what)"을 처리할지에 초점을 맞춘 선언형 프로그래밍 스타일을 지원합니다. 이로 인해 코드가 간결하고 가독성이 좋아집니다.
명령형 프로그래밍 방식(Imperative):
List<String> result = new ArrayList<>();
for (String name : names) {
if (name.startsWith("A")) {
result.add(name.toUpperCase());
}
}
Stream을 활용한 선언형 방식:
List<String> result = names.stream()
.filter(name -> name.startsWith("A"))
.map(String::toUpperCase)
.collect(Collectors.toList());
Stream은 데이터 처리를 병렬로 수행할 수 있는 parallelStream() 메서드를 제공합니다. 이를 통해 멀티코어 프로세서의 성능을 효과적으로 활용할 수 있습니다. 병렬 처리는 데이터를 여러 쓰레드에서 나누어 처리하며, 복잡한 설정 없이 병렬 작업을 구현할 수 있습니다. 병렬 처리는 성능 향상에 유리하지만, 데이터의 순서가 중요하지 않은 경우에 적합합니다. 또한, 병렬 처리는 항상 성능을 향상시키는 것은 아니며, 데이터 크기와 작업 특성에 따라 다를 수 있습니다.
요약
Stream과 Collection의 차이
Stream lifecycle
Java Stream의 라이프사이클은 데이터 소스에서 시작하여 최종 연산이 수행될 때 종료되는 전체 과정을 의미합니다. Stream은 한 번 사용되고 나면 재사용할 수 없기 때문에, 라이프사이클의 각 단계를 이해하는 것이 중요합니다.
스트림 처리 단계는 두 가지로 나뉩니다:
- 중간 연산 (Intermediate Operations)
- 데이터를 변환하거나 필터링하는 연산.
- 지연 실행(lazy execution)으로 최종 연산이 호출되기 전까지 실행되지 않습니다.
- 연산 결과는 새로운 스트림을 반환합니다.
- 최종 연산 (Terminal Operation)
- 데이터를 소모하여 결과를 생성하는 연산.
- 최종 연산이 호출되는 시점에 중간 연산이 실행되며, 스트림 파이프라인이 한꺼번에 처리됩니다.
- 최종 연산 이후 스트림은 소멸됩니다.
스트림 소멸
스트림은 최종 연산이 수행된 후 소멸됩니다. 한 번 최종 연산이 호출되면 스트림은 재사용할 수 없으며, 새로운 스트림을 생성해야 합니다.
- 최종 연산 이후 스트림 객체를 다시 사용하려 하면 IllegalStateException이 발생합니다.
- 스트림 소멸 후 데이터 소스는 영향을 받지 않습니다.
'🚣활동 > NHN Academy' 카테고리의 다른 글
Thread (스레드) (0) | 2025.02.03 |
---|---|
Process (프로세스) (0) | 2025.02.03 |
Lambda Expression (0) | 2025.01.20 |
객체 생성과 제거 (0) | 2025.01.16 |
참조 타입 (0) | 2025.01.14 |