자바 스트림(Stream)

coldrice99·2024년 9월 9일
0

1. 스트림이란?

스트림은 자바 8에서 도입된 데이터 처리 API로, 데이터의 흐름을 처리하는 데 중점을 둔다. 컬렉션이나 배열의 데이터를 간결하고 선언적인 방식으로 처리할 수 있게 해주는 도구이다. 스트림을 사용하면 데이터를 필터링, 변환, 집계 등의 작업을 쉽게 할 수 있다.

스트림의 주요 특징:

  1. 데이터 변경 없음: 스트림은 데이터를 처리할 뿐, 원본 데이터를 변경하지 않는다.
  2. 일회용: 스트림은 한 번 사용되면 다시 사용할 수 없다.
  3. 내부 반복: 스트림은 컬렉션을 내부적으로 처리하여 루프를 관리하며, 개발자는 반복을 직접 제어하지 않는다.
  4. 지연 연산: 스트림의 중간 연산은 최종 연산이 호출될 때까지 실제로 실행되지 않는다.
  5. 병렬 처리 지원: 스트림은 쉽게 병렬 처리를 적용할 수 있다.

2. 스트림의 기본 사용법

스트림을 사용하기 위해서는 보통 다음 3단계를 따른다:

  1. 스트림 생성: 컬렉션, 배열 등에서 스트림을 생성한다.
  2. 중간 연산: 스트림을 가공하거나 필터링하는 연산을 수행한다. 이때 스트림이 반환된다.
  3. 최종 연산: 스트림을 처리하고 결과를 얻는 연산을 수행한다. 여기서 결과는 리스트나 값, 출력 등으로 반환된다.

예시:

import java.util.Arrays;
import java.util.List;

public class StreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("John", "Jane", "Jake", "Tom");

        // 스트림을 사용해 'J'로 시작하는 이름을 필터링하고 출력
        names.stream() // 1. 스트림 생성
             .filter(name -> name.startsWith("J")) // 2. 중간 연산
             .forEach(System.out::println); // 3. 최종 연산
    }
}

출력:

John
Jane
Jake

3. 스트림 연산

스트림 연산은 크게 두 가지로 나뉜다:

  1. 중간 연산: 스트림을 변환하거나 필터링하지만, 최종 연산이 호출될 때까지 실행되지 않는다.
    • 예시: filter(), map(), sorted()
  2. 최종 연산: 스트림을 처리하여 최종 결과를 반환한다. 이때 스트림은 더 이상 사용할 수 없다.
    • 예시: forEach(), collect()

1) 중간 연산

filter(): 조건에 맞는 요소만 남긴다.

names.stream()
     .filter(name -> name.length() > 3)
     .forEach(System.out::println); // 이름 길이가 3 초과인 요소 출력

map(): 각 요소를 다른 값으로 변환한다.

names.stream()
     .map(String::toUpperCase) // 모든 이름을 대문자로 변환
     .forEach(System.out::println);

sorted(): 요소를 정렬한다.

names.stream()
     .sorted()
     .forEach(System.out::println); // 이름을 알파벳 순서로 정렬 후 출력

2) 최종 연산

forEach(): 스트림의 각 요소에 대해 작업을 수행한다.

names.stream()
     .forEach(System.out::println); // 각 요소 출력

collect(): 스트림의 결과를 리스트나 다른 컬렉션으로 변환한다.

List<String> filteredNames = names.stream()
    .filter(name -> name.startsWith("J"))
    .collect(Collectors.toList()); // 'J'로 시작하는 이름을 리스트로 수집

4. 스트림의 장점

1) 간결한 코드

스트림을 사용하면 복잡한 반복문을 대체할 수 있고, 선언적인 방식으로 코드를 작성할 수 있어 가독성이 높아진다.

예시: 기존 반복문 방식

for (String name : names) {
    if (name.startsWith("J")) {
        System.out.println(name);
    }
}

스트림 사용:

names.stream()
    .filter(name -> name.startsWith("J"))
    .forEach(System.out::println);

2) 병렬 처리

스트림은 쉽게 병렬 처리로 변환할 수 있다. parallelStream()을 사용하면 데이터를 병렬로 처리하여 성능을 높일 수 있다.

예시:

names.parallelStream()
    .filter(name -> name.startsWith("J"))
    .forEach(System.out::println); // 병렬 처리로 요소 출력

5. 스트림의 자주 사용하는 메서드

  • filter(): 조건에 맞는 요소만 남김.
  • map(): 요소를 다른 값으로 변환.
  • forEach(): 각 요소에 대해 작업을 수행.
  • collect(): 스트림 결과를 리스트 등으로 변환.
  • sorted(): 요소를 정렬.
  • limit(): 스트림의 결과를 제한.
  • distinct(): 중복을 제거.

요약

스트림은 자바 8에서 도입된 데이터 처리 API로, 데이터를 간결하고 선언적인 방식으로 처리할 수 있다. 스트림은 필터링, 매핑, 집계 등의 작업을 통해 코드를 간결하게 작성할 수 있으며, 병렬 처리를 통해 성능도 향상시킬 수 있다.

스트림을 활용하면 반복문을 대체하여 가독성이 높은 코드를 작성할 수 있고, 자주 사용하는 메서드인 filter(), map(), forEach() 등을 숙지하는 것이 중요하다.


profile
서두르지 않으나 쉬지 않고

0개의 댓글