ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 코드잇 백엔드 스프린트 - 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()은 중첩된 데이터를 평탄화할 때 사용🚀

     
    반응형
Designed by Tistory.