IT/JAVA
[JAVA] 자바 기초 복습 (Chapter.14) part3
j8970
2025. 3. 6. 09:59
📅 학습 기간: 2월 3주차!
🎯 학습 내용: 스트림 API 개념 및 활용
📌 1. 스트림 API란?
💡 컬렉션 데이터를 선언적으로 처리하도록 지원하는 도구
- 데이터 필터링, 변환, 집계 등의 작업 수행
- 람다 표현식과 결합하여 간결한 코드 작성 가능
- 함수형 프로그래밍 기법과 함께 사용
✅ 2. 스트림 API의 특징
1️⃣ 데이터 파이프라인 구축
- 데이터를 연속적으로 처리하는 방식
- 여러 중간 연산을 연결하여 최종 연산에서 처리
2️⃣ 불변성 (Immutable)
- 원본 데이터 변경 없이 새로운 값을 반환
3️⃣ 지연 처리 (Lazy Evaluation)
- 중간 연산은 즉시 실행되지 않고 최종 연산이 호출될 때 실행
✅ 3. 스트림 API의 기본 구성 요소
1) 소스 (Source)
- 스트림을 생성하는 단계
- 컬렉션, 배열, 파일을 스트림의 소스로 사용
List<String> names = Arrays.asList("전창현1", "전창현2", "문창배1", "문창배2");
Stream<String> nameStream = names.stream(); // 리스트를 스트림으로 변환
2) 중간 연산 (Intermediate Operations)
- 데이터를 필터링 및 변환하는 과정
- 연산이 연속적으로 연결 가능하며 새로운 스트림을 반환
메서드 | 설명 |
---|---|
filter(Predicate<T>) |
조건에 맞는 요소만 선택 |
map(Function<T, R>) |
요소 변환 |
sorted() |
요소 정렬 |
distinct() |
중복 제거 |
limit(n) |
처음부터 n개 선택 |
skip(n) |
처음부터 n개 건너뜀 |
names.stream()
.map(name -> name + "님") // "전창현1" → "전창현1님"
.filter(name -> name.startsWith("전")) // "전창현1님" 선택
.forEach(System.out::println);
3) 최종 연산 (Terminal Operations)
- 스트림의 모든 데이터를 처리하고 결과 반환
- 최종 연산이 호출되면 스트림이 종료됨 (재사용 불가!)
메서드 | 설명 |
---|---|
forEach(Consumer<T>) |
각 요소를 처리 (반환 X) |
collect(Collectors.toList()) |
결과를 리스트로 변환하여 반환 |
reduce(BinaryOperator<T>) |
모든 요소를 하나의 값으로 줄임 |
count() |
요소 개수 반환 |
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squaredNumbers = numbers.stream()
.map(n -> n * n) // 각 요소를 제곱
.collect(Collectors.toList()); // 리스트로 변환
System.out.println(squaredNumbers); // [1, 4, 9, 16, 25]
✅ 4. 스트림의 일회성 (재사용 불가)
💡 스트림은 한 번 사용하면 다시 사용할 수 없음!
Stream<Integer> stream = numbers.stream();
stream.map(n -> n * n)
.collect(Collectors.toList());
// stream.filter(n -> n % 2 == 0) // IllegalStateException 발생
// .collect(Collectors.toList());
📌 스트림을 재사용하려면 새로운 스트림을 생성해야 함!
🎯 소감
📌 스트림 API를 사용하면 코드가 직관적이고 가독성이 좋아짐
📌 해당 기술들은 프로젝트를 하면서 많이 사용 될 것 같음 중요!!
📌 람다식과 함께 사용하면 코드가 더욱 간결해짐!
🚀 마무리
이번 장에서는 스트림 API의 개념과 주요 기능을 학습했다!