Backend
home

자바 Stream API 완전정복 - for문과의 차이점 & 실전 활용법

생성 일시
2025/05/01 15:17
태그
Java
게시일
2025/05/02
최종 편집 일시
2025/05/04 15:18

Stream API란?

자바 8부터 도입된 Stream API는 데이터 처리를 선언형(함수형) 스타일로 쉽게 다룰 수 있게 해주는 기능이다. 배열이나 컬렉션을 반복문 없이 간결하게 처리할 수 있다.

1. 전통적인 for문 방식 vs Stream 방식

for문으로 리스트 요소 출력

List<String> names = Arrays.asList("홍길동", "이몽룡", "성춘향"); for (String name : names) { System.out.println(name); }
Java
복사

Stream으로 리스트 요소 출력

names.stream() .forEach(System.out::println);
Java
복사
Stream 방식이 더 간결하고 가독성이 좋음.

2. for문 vs Stream 실전 차이점

비교 항목
for문
Stream API
방식
명령형 프로그래밍
선언형 프로그래밍
코드 길이
상대적으로 길다
간결하다
병렬 처리
수동으로 구현 필요
.parallelStream()로 쉽게
가독성
복잡한 경우 가독성 떨어짐
체이닝으로 가독성 높음
부작용 (Side Effect)
가능성 높음
함수형 스타일로 부작용 최소화

3. Stream의 핵심 메소드 정리

메소드
역할
filter()
조건에 맞는 요소 필터링
map()
요소 변환
sorted()
정렬
collect()
결과 수집
forEach()
반복 실행
reduce()
집계 연산

4. 실전 활용 예제

4-1. 조건에 맞는 요소만 필터링 (filter)

List<String> names = Arrays.asList("홍길동", "이몽룡", "성춘향", "변학도"); names.stream() .filter(name -> name.startsWith("이")) .forEach(System.out::println); // 출력: 이몽룡
Java
복사

4-2. 요소 변환 (map)

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> squared = numbers.stream() .map(n -> n * n) .collect(Collectors.toList()); System.out.println(squared); // 출력: [1, 4, 9, 16, 25]
Java
복사

4-3. 정렬 (sorted)

List<String> names = Arrays.asList("홍길동", "이몽룡", "성춘향", "변학도"); List<String> sortedNames = names.stream() .sorted() .collect(Collectors.toList()); System.out.println(sortedNames); // 출력: [변학도, 성춘향, 이몽룡, 홍길동]
Java
복사

4-4. 합계 구하기 (reduce)

int sum = numbers.stream() .reduce(0, (a, b) -> a + b); System.out.println(sum); // 출력: 15
Java
복사

5. 병렬 처리: parallelStream()

Stream의 강력한 장점 중 하나는 병렬 처리이다.
names.parallelStream() .forEach(System.out::println);
Java
복사
내부적으로 멀티 스레드로 실행되므로 대용량 데이터 처리에 유리!

6. 실무 팁: 언제 Stream을 쓰면 좋은가?

추천 상황
비추천 상황
데이터 필터링, 변환, 수집 등 선언형 처리
인덱스 기반 반복이 필요할 때
병렬 처리가 필요할 때
성능이 민감한 로직일 때
함수형 스타일을 지향할 때
외부 상태 변경이 필요할 때

7. 마무리 요약

for문보다 Stream API가 코드가 짧고 가독성 좋음
Stream은 filter, map, collect, reduce 등의 메소드 체이닝으로 데이터 처리
병렬 처리(parallelStream())까지 쉽게 가능
실무에서도 DTO 변환, 필터링, 정렬 등에 매우 자주 사용됨