23장. 스트림(Stream) API 기초 - 자바의 선언형 데이터 처리 시작하기
"for문이 너무 복잡하다면?" 스트림(Stream) API로 더 깔끔하고 선언적인 자바 코드를 작성해보세요!
안녕하세요! 이번 글에서는 자바 8부터 도입된 혁신적인 기능인 Stream API에 대해 소개해드릴게요. 스트림을 사용하면 for문이나 if문으로 복잡하게 짜던 데이터를 아주 깔끔하게 처리할 수 있어요. 저도 기존에 반복문으로 필터링과 정렬을 하던 습관에서 벗어나 스트림을 쓰기 시작하면서 코드가 한눈에 들어오고 유지보수가 훨씬 쉬워졌어요. 처음에는 함수형 스타일이 낯설 수 있지만, 한 번 익히면 그 편리함에서 헤어나오기 어렵답니다. 이번 23장에서는 스트림의 기본 개념부터 필수 메서드들까지 하나씩 알아볼게요!
스트림(Stream)이란 무엇인가?
스트림(Stream)은 자바에서 데이터를 선언적이고 함수형 방식으로 처리할 수 있게 해주는 API예요. 반복문을 사용하지 않고, 데이터의 흐름을 파이프라인처럼 연결해서 필터링, 매핑, 정렬 등을 간결하게 처리할 수 있어요. 스트림은 원본 데이터를 변경하지 않고, 일회용으로 처리되는 것이 특징이에요.
스트림과 컬렉션의 차이
비교 항목 | 컬렉션 | 스트림 |
---|---|---|
데이터 저장 | 데이터를 직접 저장 | 데이터를 저장하지 않고 전달 |
반복 처리 | 외부 반복 사용 (for, while) | 내부 반복 사용 (함수형 방식) |
재사용성 | 여러 번 반복 가능 | 한 번만 사용 가능 (일회용) |
Stream의 주요 메서드들
- filter(Predicate): 조건에 맞는 요소만 추출
- map(Function): 요소 변환
- sorted(): 정렬
- collect(Collectors): 결과 수집
스트림 파이프라인이란?
스트림 파이프라인(Stream Pipeline)은 데이터를 처리하는 일련의 연결된 작업 체인을 의미해요. 크게 세 가지 단계로 나뉘는데, 생성 → 중간 연산 → 최종 연산 순으로 진행돼요. 모든 연산은 지연(lazy)되며, 최종 연산이 실행될 때에야 실제로 데이터가 처리돼요.
List<String> list = Arrays.asList("apple", "banana", "avocado");
List<String> result = list.stream()
.filter(s -> s.startsWith("a"))
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
중간 연산과 최종 연산의 구분
구분 | 설명 | 예시 |
---|---|---|
중간 연산 | 스트림을 변형시키지만 실행은 지연됨 | filter, map, sorted |
최종 연산 | 실제로 데이터를 처리하고 결과 반환 | collect, forEach, count |
스트림 사용 시 흔한 실수들
- 최종 연산 후 같은 스트림을 다시 사용하려고 함 (스트림은 일회용)
- 스트림 내부에서 외부 상태를 변경하는 부작용 있는 코드를 작성함
- 병렬 스트림을 잘못 사용해 동기화 문제를 유발함
스트림은 데이터 흐름을 한 번에 처리하도록 설계돼 있어요. 파이프라인을 통해 순차적으로 처리되며, 최종 연산 후에는 재사용이 불가능해요.
보통은 filter → map 순으로 작성하는 것이 좋지만, 상황에 따라 달라질 수 있어요. 필터링으로 먼저 데이터를 줄이고 나중에 변환하는 게 일반적이에요.
forEach는 결과를 출력하거나 소비할 때 사용되고, collect는 결과를 새로운 리스트나 맵으로 수집할 때 쓰여요. 용도에 맞게 선택해야 해요.
데이터가 방대하고, 각 요소 간 의존성이 없을 때 병렬 스트림을 쓰면 성능이 좋아질 수 있어요. 단, 병렬 처리에 따른 비용과 동기화 이슈는 고려해야 해요.
꼭 그렇진 않아요. 간단한 for문이 더 빠를 때도 있고, 스트림은 코드 가독성과 선언형 처리에 더 초점을 맞춘 기능이에요. 성능은 상황에 따라 달라요.
네. 중간 연산은 스트림을 변형하고, 최종 연산이 실행되어야 실제로 스트림이 동작해요. 중간 연산만 쓰면 아무 결과도 얻을 수 없어요.
스트림(Stream) API는 자바 프로그래밍을 한 단계 더 높은 수준으로 끌어올려주는 정말 강력한 도구예요. 단순한 반복문보다 훨씬 읽기 쉽고, 깔끔하게 데이터 흐름을 구성할 수 있죠. 저도 예전에는 for문 중첩을 즐겨 썼는데, 스트림을 배우고 나서는 “이렇게 코드를 간단히 쓸 수 있었구나” 하고 놀랐어요. 초반엔 익숙하지 않아도, 실무에 한두 번만 써보면 분명히 손에 익을 거예요. 이번 장이 여러분의 코드 라이프에 새로운 전환점이 되었기를 바라며, 질문이나 예제 공유는 언제든지 환영이에요!
자바스트림, StreamAPI, 자바8기능, 함수형프로그래밍, 중간연산, 최종연산, filtermapcollect, 자바데이터처리, 자바23장, JavaStream초보
'프로그래밍 > 자바[JAVA]' 카테고리의 다른 글
25장. 회원관리 시스템 구현 (2) | 2025.05.17 |
---|---|
24장. 자바로 배우는 CRUD 게시판 만들기 (1) | 2025.05.17 |
22장. 파일 입출력 완전 정복 - File, BufferedReader, BufferedWriter 활용법 (0) | 2025.05.16 |
21장. 날짜와 시간 API 완벽 정리 - LocalDate, LocalTime, LocalDateTime 활용법 (0) | 2025.05.16 |
20장. 내부 클래스와 익명 클래스 - 자바 클래스의 유연한 구조 이해하기 (1) | 2025.05.16 |