[코드잇][위클리페이퍼][2주차] JAVA의 Stream과 매핑 연산

2026. 1. 20. 08:52·IT/코드잇

아래는 2주차 위클리페이퍼 주제이다.

  • 객체지향 프로그래밍에서 '단일 책임 원칙(SRP)'과 '개방-폐쇄 원칙(OCP)'에 대해 설명하고, 각각의 원칙을 적용한 코드 예시를 들어주세요.
  • Stream API의 map과 flatMap의 차이점을 설명하고, 각각의 활용 사례를 예시 코드와 함께 설명해주세요.

저번 포스팅에서 첫 번째 주제에 대해 이야기했고, 이번 포스팅은 두 번째 주제에 관해서 작성한다.

 

먼저 스트림이라는 것에 대해 알아야 매핑 연산의 차이를 비교할 수 있으므로 스트림에 대해서 먼저 설명하겠다.

스트림은 자바8에서 등장한 기능으로 이전에 존재하던 For문, Iterator를 조금 더 쉽게 다루기 위해 등장한 기능이다.

For문은 개발자가 직접 요소를 처리해야 하는 외부 반복이라면, Stream은 요소를 어떻게 반복할지에 대한 고민은 내려두고 람다식을 통해 무엇을 할지만 결정하면 된다.

 

람다식에 대한 설명은 이해하기 어려울 수 있으므로 생략한다. 이해를 돕기 위해 간략하게 설명하자면 함수를 대신하는 역할이라고 이해하면 될 것 같다.

// 함수형 작성
public Integer apply(String s) {
        return s.length();
    }
    
// 람다식 작성
s -> s.length()

 

스트림의 사용 방법은 다음과 같다.

  1. 생성(Source): 스트림 인스턴스 생성 (배열, 리스트 등에서)
  2. 중간 연산(Intermediate Operations): 데이터를 가공하거나 필터링 (e.g., map, filter, sorted)
  3. 최종 연산(Terminal Operations): 결과를 도출 (e.g., collect, forEach, count)

중요한 점: 중간 연산자들은 **게으른 연산(Lazy Evaluation)**을 수행함. 최종 연산자가 호출되기 전까지는 실제로 데이터 처리를 시작하지 않고, 연산의 구조만 정의함. 이를 통해 컴파일러가 알아서 최적의 연산을 진행함. 또한, 최종 연산자가 호출된 스트림은 다시 사용할 수 없음.

 

이제 스트림의 핵심 개념을 알았으니 중간 연산 중 일부인 map과 flatmap의 차이에 대해서 알아보자.

map은 말 그대로 매핑을 하는 연산이다. 스트림의 요소들에게 각각 람다식으로 작성된 함수를 적용하는 것이다.

List<String> words = Arrays.asList("Java", "Stream", "API");

List<Integer> wordLengths = words.stream()
    .map(String::length) // 1:1 변환
    .collect(Collectors.toList());
    
    
// 맵의 반환값: 4, 6, 3
// 최종 결과: [4, 6, 3]

위 코드는 리스트를 스트림화 해서 중간 연산인 map으로 각 요소들에 length 함수를 적용하고 collect 최종 연산으로 다시 리스트화 하는 것이다. map은 이처럼 스트림의 요소들을 함수와 1:1로 매핑해서 적용하는 것이다.

 

다음은 flatmap에 대해서 알아보자.

flatmap은 맵과 동일하게 스트림의 요소들에 함수를 적용하는 것은 동일하다. 그러나 맵과의 차이점은 평탄화 과정이 존재하여 플랫맵에 적용할 함수는 스트림을 반환해야 한다는 차이점이 있다. 이러한 특징으로 인해 map과는 다르게 요소의 개수가 증가할 수 있다.스트림 안에 요소가 여러개가 있을 수 있기 때문이다.

List<String> sentences = Arrays.asList("Hello World", "Java Stream");

// 문장들을 단어 단위로 쪼개서 하나의 리스트로 만듦
List<String> words = sentences.stream()
    .flatMap(sentence -> Arrays.stream(sentence.split(" "))) // 1. split으로 배열 생성 -> 2. 배열을 스트림으로 변환 -> 3. 합침
    .collect(Collectors.toList());

// 플랫맵의 반환값: ["Hello", "world", "Java", "Stream"]
// 결과: ["Hello", "World", "Java", "Stream"]


// 만약 동일한 연산을 Map으로 한다면?
List<String[]> result = sentences.stream()
    .map(sentence -> sentence.split(" ")) // String -> String[] (배열)로 변환
    .collect(Collectors.toList());

// 맵의 반환값: ["Hello", "World"], ["Java", "Stream"]
// 결과: [["Hello", "World"], ["Java", "Stream"]]

 

 

최종 요약하면 다음과 같다.

특징 map flatmap
핵심 기능 데이터 변환 (Transformation) 변환 + 평탄화 (Flattening)
입출력 비율 1 : 1 1 : N (0개 이상)
매핑 함수의 반환값 임의의 객체 (R) 스트림 (Stream<R>)
활용 예시 대문자 변환, 객체에서 특정 필드 추출 중첩 리스트 병합, 문장 쪼개기

 

이로써 자바의 Stream과 중간연산인 map, flatmap에 대해서 포스팅을 마친다.

'IT > 코드잇' 카테고리의 다른 글

[코드잇][위클리페이퍼][4주차] 프레임워크와 라이브러리의 차이점  (0) 2026.01.26
[코드잇][위클리페이퍼][4주차] Spring Framework의 탄생 배경  (0) 2026.01.26
[코드잇][위클리페이퍼][3주차] 알고리즘과 자료구조  (0) 2026.01.20
[코드잇][위클리페이퍼][2주차] 객체지향 설계의 5가지 원칙  (0) 2026.01.12
[코드잇][위클리페이퍼][1주차] Git 내용에 관한 정리  (0) 2026.01.05
'IT/코드잇' 카테고리의 다른 글
  • [코드잇][위클리페이퍼][4주차] Spring Framework의 탄생 배경
  • [코드잇][위클리페이퍼][3주차] 알고리즘과 자료구조
  • [코드잇][위클리페이퍼][2주차] 객체지향 설계의 5가지 원칙
  • [코드잇][위클리페이퍼][1주차] Git 내용에 관한 정리
PSG-00
PSG-00
개발자의 작고 소중한 공간
  • PSG-00
    PSG-00님의 블로그
    PSG-00
  • 전체
    오늘
    어제
    • 분류 전체보기 (14)
      • 잡담 (0)
        • 여행 (0)
        • 운동 (0)
      • IT (6)
        • 백엔드 (0)
        • 프론트엔드 (0)
        • 알고리즘(PS) (0)
        • 코드잇 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    git
    SOLID
    코드잇
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
PSG-00
[코드잇][위클리페이퍼][2주차] JAVA의 Stream과 매핑 연산
상단으로

티스토리툴바