본문 바로가기
java

[Java] Stream 이란, Stream의 필요성 - 1

by 장인이 2024. 5. 2.

1. 개요

 이번 게시물에서는 Java 8에서 부터 제공하는 Stream에 대해서 알아볼 것이다. Stream이 언제, 왜 나왔는지부터 시작해서 Stream의 구성요소까지 순서대로 알아보자.

 실제 Stream을 사용하는 방법에 대해서는 다음 게시물을 살펴보자.

 

[Java] Stream 사용법 - 2

(작성중)

 

 

2. Stream

 Stream은 마찬가지로 자바 8에서 추가된 람다식을 활용할 수 있는 기술이다. 자바 8 이전에는 배열 혹은 Collection 인스턴스의 데이터를 다뤄야 할 경우에 for, for-each문을 주로 사용하였다.

int[] testList = { 5, 4, 3, 2, 1 };
for (int i=0; i<5; i++) {
    System.out.println(testList[i]);
}

 

 이렇게 간단한 경우는 상관없다. 하지만 로직이 복잡해지면 코드의 양도 덩달아 길어지게 되고, 여러 로직이 섞이게 되면서 길이는 길어지며 해석하기 어려운 상태가 되어버린다. 

 

 이런 문제상황을 극복하기 위해 나온 것이 Stream이다! Stream은 '흐르다'는 사전적 의미를 가지고 있으며, 여기서는 '데이터의 흐름' 이라는 뜻으로 쓰인다. 스트림을 활용하면 데이터를 추상화 하여 원본 데이터가 무엇이든지 간에 같은 방식으로 다룰수 있게 된다!

 결국 자바는 객체지향 언어이지만, 마치 함수형 프로그래밍을 하는 것처럼 코드 설계를 할 수 있게 된다.

 

 

3. Stream의 특징

1) 스트림은 원본 데이터를 변경하지 않는다

List<String> sortedList = Arrays.stream(strList).sorted().collect(Collections.toList());

 

 스트림은 원본 데이터에서 값을 읽어와 별도로 재구성한 후 결과를 반환하기 때문에, 원본 데이터는 바뀌지 않는다.

 

2) 스트림은 일회용이다

//stream 선언 후 사용
myIntStream.min().getAsInt();

//이미 종료된 stream을 다시 사용하려 할 경우
long count = testStream.count() //에러 발생!!

 

 스트림은 일회용으로, 한번 사용한 순간 재사용이 불가능해진다. 만일에 재사용하려고 할 경우, IllegalStateException이 발생한다!

 

3) 스트림은 작업을 내부 반복으로 처리한다

for(String str : strList) {
    System.out.println(str);
}

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

 

 스트림을 활용할 경우 간단하게 처리할 수 있는 이유가 바로 이 덕분이다. 기존에는 반복을 처리하기 위해 for, for-each문을 사용했다면, 스트림에서는 반복을 메서드에 숨겨 깔끔한 설계가 가능해진다.

 

 

4. Stream 구조

 스트림은 크게 3가지 단계로 나눌 수 있다.

1)생성하기  ->  2)가공하기  ->  3)결과 만들기

 

1) 생성하기

 스트림 연산을 하기 위해서, 먼저 스트림을 생성해야 한다. 스트림은 배열, 컬렉션, 임의의 수, 문자열, 파일, 혹은 직접 데이터를 넣어 생성할 수 있다.

 

2) 가공하기

 스트림 진행 과정에서 가장 핵심적인 부분으로, 원본 데이터를 읽어온 후 원하는 데이터로 가공하기 위한 단계이다. 원하는 형태로 처리할 수 있으며, 모든 중간 연산의 반환 값은 Stream이기 때문에 개발자가 필요한 만큼 중복해서 사용 가능한다. 주로 매핑, 혹은 필터링을 하게 된다.

 

3) 결과 만들기

 가공된 데이터를 원하는 형식으로 만들어서 반환한다. 작업이 끝날 경우, 해당 스트림은 다시 사용할 수 없는 상태로 바뀐다.

 

 결국, 실질적인 흐름을 적어보면 다음과 같다.

스트림 생성  ->  가공1  ->  가공2  ->  ...  ->  결과 만들기  ->  결과물 반환

 

 

5. 정리

 이제 Stream을 활용하면 더 깔끔하고, 통일성 있는 설계를 할 수 있다는 사실을 알았다. 이제 다음 게시물을 확인하여, Stream을 사용해보자!

 

 

 


 

참고 자료

https://futurecreator.github.io/2018/08/26/java-8-streams/

https://hstory0208.tistory.com/entry/Java%EC%9E%90%EB%B0%94-Stream%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%9D%B4%EB%9E%80

https://mangkyu.tistory.com/112

 

 

'java' 카테고리의 다른 글

[Java] String.repeat()  (0) 2023.05.31
[Java] StringBuilder  (0) 2023.05.29
[Java] 코테 준비를 위한 입출력  (0) 2023.05.29
자바(Java) - static import  (0) 2022.12.17

댓글