티스토리 뷰
공부/오늘의공부

스트림

고여리 2023. 1. 17.

스트림이란 자바 8부터 도입된 문법으로 배열 및 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 하는 반복자다.

스트림의 사전적 의미는 개울, 냇가, 흐름을 말하는데 자바에서의 스트림은 데이터의 흐름을 의미한다.

즉 각 데이터를 흐름에 따라 우리가 원하는 결과로 가공하고 처리하는 일련의 과정을 스트림이라 할 수 있겠다.

스트림의 장점은 for문과 iterator에 비해 코드가 짧고 간결하며 기존 방식으로 데이터를 처리하는 경우에는 표준화된 하나의 방식이 아니라 데이터 소스에 따라 그에 부합하는 방식의 메서드를 작성해야 했지만 스트림의 경우 데이터 소스에 관계없이 같은 방식으로 가공 및 처리가 가능함 -> 배열이냐 컬렉션이냐에 관계없이 하나의 통합된 방식으로 데이터를 다룰 수 있다는 큰 장점이 존재한다.

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

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("주먹밥");
        list.add("덮밥");
        list.add("치킨");

        String[] array = new String[3];
        array[0] = "주먹밥";
        array[1] = "덮밥";
        array[2] = "치킨";

        list.stream().forEach(System.out::println); //stream() 메서드를 사용해서 list의 스트림 객체를 생성하고 forEach()메서드를 사용한다.
        Arrays.stream(array).forEach(System.out::println); //stream()메서드를 사용하여 array의 스트림 객체를 만들어주고
        				//forEach메서드를 통해 데이터 소스의 각요소들을 순회하면서 println을 실행하고 있다.
    }				//위와 같이 다른 타입의 두 구성요소들을 동일하게 처리가 가능하다.
}

// 결과값
주먹밥
덮밥
치킨
주먹밥
덮밥
치킨

스트림은 다음과 같은 특징을 가진다

1. 스트림의 처리과정은 생성, 중간연산, 최종연산의 3단계로 구성된다.(중간연산은 생략가능하다)

2. 스트림은 원본 데이터 소스를 변경하지 않는다

3.스트림은 일회용이다.

4.스트림은 내부 반복자이다.

 

스트림은 위의 예시와 같이 다양한 데이터 소스들을 일원화 하여 작업하기 위해 해당 데이터들을 기반으로 스트림 객체를 생성한 뒤 작업이 가능하다. 위에서 배열의 경우 Arrays.stream() 메서드 list의 경우 stream()메서드를 통해서 스트림 객체를 생성하는 것을 알 수 있다.

스트림 객체를 생성한 이후 데이터를 원하는 형태로 재조립 하기 위해서 중간 연산을 거친다. 중간연산에는 정렬,매핑,필터링 등이 포함되며 여러번 가능하다. 만약 단지 원본데이터를 스트림을 통해 다른 타입으로 변형한다는 등 따로 원본을 수정할 필요가 없으면 중간연산을 건너뛰어도 무방하다.

 마지막으로 중간연산이 완료된 스트림을 최종적으로 처리하는 최종연산을 끝으로 스트림의 모든 데이터 처리가 완료된다.

 최종 연산의 경우에는 스트림의 요소를 소모하면서 연산을 수행하기 때문에 단 한번의 연산만 가능하다.

스트림은 위에서 설명했듯이 데이터를 스트림 객체를 생성해 재구성하기 때문에 원본 데이터 소스를 변경하지 않는다는 특징을 가지고 있다. 또한 이것은 원본 데이터가 스트림에 의해 임의로 변경되거나 데이터가 손상되는 일을 방지하기 위함이기도 하다.

 그리고 최종연산이 수행되고 난 뒤에는 스트림을 사용할 수 없기 때문에 일회용이라고 할 수 있다.

마지막으로 스트림은 for문, iterator를 사용하는 while문과 같이 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드패턴인 외부 반복자가 아니라 컬렉션 내부에서 데이터 요소 처리방법을 주입시켜 요소를 반복처리하는 내부 반복자이다.

 

 

'공부 > 오늘의공부' 카테고리의 다른 글

Spring Security의 권한 부여 처리 흐름  (0) 2023.03.17
스프링 시큐리티 인증 처리흐름  (0) 2023.03.16
람다  (0) 2023.01.16
컬렉션 Map  (0) 2023.01.12
컬렉션 Set  (0) 2023.01.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함