카테고리 없음

☕ Java 8 Stream API 기본 가이드

IT Lab 2025. 6. 22. 22:42

✅ 1. Stream이란?

Java 8에서 도입된 Stream API는 데이터를 함수형 스타일로 선언적으로 처리할 수 있도록 도와주는 기능입니다.

  • 데이터의 흐름(Stream)을 추상화한 객체
  • 컬렉션(List, Set 등)의 요소를 간결하게 처리 가능
  • 내부 반복을 사용하여 가독성과 효율성 향상
  • 데이터를 변경하지 않고 처리하는 비파괴적 처리 방식

✅ 2. Stream 처리 단계

Stream은 다음과 같은 3단계로 구성되어 처리됩니다:

  1. 스트림 생성
  2. 중간 연산 (filter, map 등)
  3. 최종 연산 (collect, forEach 등)
List<String> list = Arrays.asList("a", "b", "c");

List<String> result = list.stream()
    .filter(s -> !"b".equals(s))
    .map(String::toUpperCase)
    .collect(Collectors.toList());

✅ 3. 스트림 생성 방법

방법예시 코드

컬렉션 list.stream()
배열 Arrays.stream(arr)
직접 값 지정 Stream.of(1, 2, 3)
무한 스트림 Stream.generate(Math::random)

✅ 4. 주요 연산 메서드

🔹 중간 연산 (Intermediate)

메서드 설명
filter(Predicate) 조건에 맞는 요소만 필터링
map(Function) 요소를 다른 형태로 변환
sorted() 정렬
distinct() 중복 제거
limit(n) / skip(n) 앞 n개 선택 / 앞 n개 건너뜀

🔹 최종 연산 (Terminal)

메서드 설명
collect() 결과를 수집 (List, Set 등으로 반환)
forEach() 요소 반복 처리
count() 요소 개수 반환
anyMatch() / allMatch() 조건 일치 여부 판단
reduce() 누적값 계산 (예: 합계)

✅ 5. 실전 예제

List<String> names = Arrays.asList("홍길동", "김철수", "이영희");

List<String> result = names.stream()
    .filter(name -> name.startsWith("김"))
    .map(String::toUpperCase)
    .collect(Collectors.toList());

System.out.println(result); // [김철수]

✅ 6. 병렬 스트림 (Parallel Stream)

list.parallelStream().forEach(System.out::println);
  • 멀티코어 CPU 환경에서 병렬 처리 가능
  • 주의사항: 순서 보장 X, 공유 자원 접근 시 동기화 필요

✅ 7. Stream API의 장단점

✅ 장점

  • 코드가 간결하고 가독성이 높음
  • 함수형 프로그래밍 방식으로 유연한 데이터 처리
  • 병렬 처리에 유리

⚠️ 단점

  • 디버깅이 어려움 (중간 상태 확인이 번거로움)
  • 스트림은 1회성이라 재사용 불가
  • 무한 스트림 사용 시 종료 조건 주의 필요

✅ 8. 실무 팁

  • filter + map + collect는 가장 자주 쓰이는 기본 패턴입니다.
  • 성능이 중요한 경우 parallelStream() 활용을 고려해보세요.
  • peek() 메서드는 디버깅 시 중간 상태를 확인하는 데 유용합니다.

이 글은 Java 8 Stream API의 기본 개념을 이해하고 실무에 활용할 수 있도록 구성된 입문 가이드입니다. 이후에 collect(), reduce(), groupingBy() 등 고급 주제도 함께 학습하시면 Stream을 더욱 효과적으로 활용할 수 있어요 ✨