-
코드잇 백엔드 스프린트 - 4주차 위클리-페이퍼 : 특정 함수변환개발/활동 2025. 3. 3. 22:25반응형
위클리 페이퍼는 이론 수업에서 배운 내용에 관련된 특정 주제에 대하여 심화 학습을 하고, 학습한 내용을 문서로 작성하는 과제입니다.
- Stream API의 map과 flatMap의 차이점을 설명하고, 각각의 활용 사례를 예시 코드와 함께 설명해주세요.
🔍 Stream API의 map() vs flatMap() 차이점
map()과 flatMap()은 Java Stream API에서 데이터 변환을 수행하는 중요한 메서드야.
하지만 동작 방식이 다르며, 사용할 상황이 다름.메서드 주요 특징 반환 타입
map(Function<T, R>) 입력 데이터를 특정 함수로 변환 Stream<R> (중첩 구조 가능) flatMap(Function<T, Stream<R>>) Stream<Stream<R>>을 평탄화(Flattening)하여 단일 Stream<R>로 변환 Stream<R> (중첩 구조 제거)
1️⃣ map() - 요소를 변환
✅ map()은 각 요소를 변환하여 새로운 요소를 생성
- 한 개의 Stream<T>을 받아, 각각을 변환하여 새로운 Stream<R>을 생성함.
- 중첩 구조가 유지됨.
📌 예제: 리스트의 문자열을 대문자로 변환
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class MapExample { public static void main(String[] args) { List<String> 이름목록 = Arrays.asList("홍길동", "이순신", "강감찬"); // 모든 이름을 대문자로 변환 List<String> 대문자이름목록 = 이름목록.stream() .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(대문자이름목록); } }📝 출력
[홍길동, 이순신, 강감찬] → [홍길동, 이순신, 강감찬]🎯 map()을 사용한 이유?
✅ String을 변환하는 작업이 필요했기 때문
✅ Stream<String> → Stream<String> 으로 변환 (단순한 매핑)
2️⃣ flatMap() - 중첩된 구조를 평탄화
✅ flatMap()은 중첩된 구조(Stream of Streams)를 단일 Stream으로 변환
- 요소를 변환하는 과정에서 리스트, 배열, 컬렉션 같은 여러 요소를 반환할 때 사용.
- 중첩된 Stream<Stream<T>>을 평탄화하여 Stream<T>으로 변환.
📌 예제: 문자열 리스트를 단어 단위로 나누기
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class FlatMapExample { public static void main(String[] args) { List<String> 문장목록 = Arrays.asList("안녕하세요 반갑습니다", "스트림 API는 강력합니다"); // 문장 리스트를 단어 단위로 분리하여 하나의 리스트로 변환 List<String> 단어목록 = 문장목록.stream() .flatMap(문장 -> Arrays.stream(문장.split(" "))) // 중첩된 Stream을 평탄화 .collect(Collectors.toList()); System.out.println(단어목록); } }📝 출력
[안녕하세요 반갑습니다, 스트림 API는 강력합니다] → [안녕하세요, 반갑습니다, 스트림, API는, 강력합니다]🎯 flatMap()을 사용한 이유?
✅ 각 문자열을 단어 단위로 변환해야 했기 때문
✅ Stream<String> → Stream<String[]> → Stream<String> (중첩된 구조를 평탄화)
3️⃣ map() vs flatMap() 차이점 예제
두 메서드의 차이를 더 명확하게 보자.
📌 예제: map()과 flatMap() 비교
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class MapVsFlatMap { public static void main(String[] args) { List<List<String>> 이름리스트 = Arrays.asList( Arrays.asList("홍길동", "이순신"), Arrays.asList("강감찬", "김유신") ); // map() 사용 (중첩 리스트 유지됨) List<Stream<String>> map결과 = 이름리스트.stream() .map(List::stream) // Stream<Stream<String>> .collect(Collectors.toList()); // flatMap() 사용 (중첩 리스트가 평탄화됨) List<String> flatMap결과 = 이름리스트.stream() .flatMap(List::stream) // Stream<String> .collect(Collectors.toList()); System.out.println("map 결과: " + map결과); System.out.println("flatMap 결과: " + flatMap결과); } }📝 출력
map 결과: [java.util.stream.ReferencePipeline$Head@74a14482, java.util.stream.ReferencePipeline$Head@1540e19d] flatMap 결과: [홍길동, 이순신, 강감찬, 김유신]🎯 차이점 정리
메서드 동작 방식 결과
map() Stream<List<String>> 유지 중첩된 Stream 유지 flatMap() Stream<String>로 평탄화 모든 요소가 하나의 Stream으로
4️⃣ map()과 flatMap() 언제 사용할까?
사용 상황 map() flatMap()
각 요소를 변환할 때 ✅ ❌ 데이터가 중첩되지 않을 때 ✅ ❌ 각 요소가 리스트 또는 배열을 반환할 때 ❌ ✅ Stream<Stream<T>>을 Stream<T>으로 변환할 때 ❌ ✅
📌 정리
메서드 변환 방식 주요 사용 예
map(Function<T, R>) 요소를 변환 (T → R) 문자열을 대문자로 변환, 숫자 변환 flatMap(Function<T, Stream<R>>) 중첩된 Stream을 평탄화 (Stream<Stream<R>> → Stream<R>) 리스트 내부의 리스트 평탄화, 문장을 단어 리스트로 변환 💡 핵심 요약
✔ map(): 1:1 변환 (데이터 자체를 변환)
✔ flatMap(): 1:N 변환 (중첩된 데이터 구조를 펼쳐서 단일 스트림으로 변환)👉 map()은 단순 변환, flatMap()은 중첩된 데이터를 평탄화할 때 사용🚀
반응형'개발 > 활동' 카테고리의 다른 글
코드잇 백엔드 스프린트 - 7주차 위클리-페이퍼 WAS (0) 2025.03.24 코드잇 백엔드 스프린트 - 6주차 위클리-페이퍼 : 프레임워크와 라이브러리의 차이점 (0) 2025.03.16 코드잇 백엔드 스프린트 - 6주차 위클리-페이퍼 : Spring Framework의 탄생 배경과 해결하고자 했던 문제점 (0) 2025.03.16 코드잇 백엔드 스프린트 - 5주차 위클리 페이퍼 : HashSet 와 O(n)과 O(log n)의 성능 차이 (0) 2025.03.09 코드잇 백엔드 스프린트 - 4주차 워클리 페이퍼 : SOLID 원칙 (1) 2025.03.03