스트림 API 1 - 기본

Jun·2025년 6월 2일

고급 자바

목록 보기
7/7

📌 Java 스트림(Stream) API 이해하기

자바 8부터 도입된 스트림(Stream)은 데이터를 물 흐르듯이 다룰 수 있게 하는 강력한 도구이다. 스트림을 이용하면 코드가 "어떻게(How)" 수행되는지보다, "무엇(What)"을 수행하고 싶은지에 집중할 수 있다. 이를 선언적 프로그래밍(Declarative Programming) 방식이라 한다.

🌊 스트림(Stream)이란?

스트림은 데이터의 흐름을 추상화한 것으로, 컬렉션이나 배열 등의 요소를 중간 연산과 최종 연산을 통해 순차적으로 처리하는 구조를 제공한다.

  • 중간 연산(Intermediate Operations): 데이터를 걸러내거나(filter), 형태를 변환(map)하는 등 중간 과정에서 데이터를 가공한다.
  • 최종 연산(Terminal Operations): 최종적으로 결과를 수집하거나, 출력하거나, 결과를 가져오는 작업을 수행한다.

🚩 스트림의 특징

  1. 데이터 소스를 변경하지 않음(Immutable)

    • 원본 데이터를 훼손하지 않고, 새롭게 결과만 생성한다.
  2. 일회성(한 번만 소비 가능)

    • 한 번 처리된 스트림은 다시 사용할 수 없다.
  3. 파이프라인(Pipeline) 구성

    • 중간 연산이 연속적으로 이어지고, 최종 연산을 만났을 때 연산이 실제로 수행된다.
  4. 지연 연산(Lazy Operation)

    • 최종 연산이 호출될 때까지 실제 연산을 지연하여 불필요한 처리를 피한다.
  5. 병렬 처리(Parallel) 가능

    • 쉽게 병렬 스트림을 생성하여 멀티코어 환경에서 효율적인 연산을 지원한다.

📌 예시 코드로 이해하는 스트림 API

List<String> names = List.of("Apple", "Banana", "Berry", "Tomato");

// "B"로 시작하는 이름만 필터링하고 대문자로 변환하여 리스트로 수집
List<String> result = names.stream()
    .filter(name -> name.startsWith("B"))
    .map(String::toUpperCase)
    .toList();

result.forEach(System.out::println);

🔄 내부 반복(Internal Iteration) vs 외부 반복(External Iteration)

  • 외부 반복: 개발자가 직접 루프를 돌려 처리한다.

    for (String s : result) {
        System.out.println(s);
    }
  • 내부 반복: 스트림 API가 자동으로 반복 처리한다.

    names.stream()
        .filter(name -> name.startsWith("B"))
        .map(String::toUpperCase)
        .forEach(System.out::println);

🚦 즉시 연산 vs 지연 연산

  • 즉시 연산(Eager Operation): 중간 연산을 호출할 때 즉시 수행하는 방식이다.
  • 지연 연산(Lazy Operation): 최종 연산이 호출되었을 때에만 중간 연산을 수행한다.

자바의 스트림 API는 지연 연산을 통해 최적화를 이루고 있다.

🔗 파이프라인 처리 방식

스트림은 파이프라인을 통해 데이터를 처리하며, 하나의 요소가 중간 연산을 통과하면 곧바로 다음 단계로 전달됩니다. 이를 통해 중간 데이터를 저장할 필요 없이 효율적으로 처리된다.

List<Integer> data = List.of(1, 2, 3, 4, 5, 6);

Integer result = data.stream()
    .filter(i -> i % 2 == 0)
    .map(i -> i * 10)
    .findFirst()
    .get();

System.out.println(result); // 출력: 20

위 코드에서 findFirst() 최종 연산은 첫 번째 조건 만족 시 바로 연산을 종료하여 불필요한 처리를 줄인다.

✅ 스트림 사용의 장점

  • 코드가 명확하고 간결해진다.
  • 데이터 처리 흐름을 직관적으로 나타낼 수 있다.
  • 효율적인 연산 처리(단축 평가)가 가능하다.
  • 병렬 처리를 쉽게 적용할 수 있다.

🎯 마무리

스트림 API를 잘 활용하면 데이터 처리 로직을 더욱 명료하게 표현하고, 효율적으로 구현할 수 있다. 이를 통해 유지보수가 쉬워지고 코드의 성능도 향상된다.

profile
꾸준하게

0개의 댓글