woowacourse-study/2022-modern-java-in-action

스트림이란 무엇인가?

Opened this issue · 1 comments

문제

자바 Stream API만이 아니라 스트림 자체가 무엇인지에 대해 정의 내려보아라.

선정 배경

  • Stream API를 제대로 사용하기 위해 머릿속에 나름대로의 정의를 잡고 가야 하는 용어
  • 굉장히 익숙한 개념이지만 한 줄로 명료하게 설명하지 못하는 용어라고 생각됨

관련 챕터

  • [4장] 스트림 소개
    • p. 141

스트림이란 무엇인가?

자세한 설명은 블로그를 참조.

스트림에 대한 보편적인 정의

컴퓨터과학에서 스트림(stream)은 기본적으로
시간의 흐름에 따라 순차적으로 사용할 수 있게 되는 일련의 데이터 요소를 가리킨다.

스트림을 구성하는 모든 데이터에 대해 작업A, 작업B, 작업C를 수행해야 하는 경우를 생각해보자.
컴퓨터는 기본적으로 스트림을 구성하는 모든 데이터에 대해 작업A를 수행하고,
그 다음에 모든 데이터에 대해 작업B를 수행하지 않는다.
스트림에서는 우선 첫 번째 데이터에 대해 작업A, 작업B, 작업C를 전부 다 수행하고,
두 번째 데이터에 대해 작업A, 작업B, 작업C를 수행하게 된다.
이는 온라인 스트리밍을 통해 유튜브 동영상을 시청하는 경우를 생각하면 왜 이러한 방식으로 데이터를 처리하는지 이해하기 쉬울 것이다.

근본 있는 언어인 자바에는 이 스트림과 관련된 API를 두 종류나 지니고 있다.

I/O Stream의 스트림

자바 애플리케이션 입장에서 입출력 과정은 스트림 인스턴스를 생성하고, 이를 통해 외부로부터 데이터를 받고, 데이터를 외부로 출력하는 방식으로 진행된다. 이 때문에 입출력 작업과 관련된 글들을 보면 스트림을 "데이터가 이동하는 통로" 혹은 운영체제에 의해 생성되는 데이터의 중간 매개자와 같이 설명하는 경우가 종종 있다. 그러나 이 설명은 I/O Stream에서 생성하는 스트림 인스턴스에 대한 설명이지 스트림 자체에 대한 정의라고 보면 안 될 것이다.

입출력과 관련된 I/O Stream(InputStream/OutputStream 등)에서 사용하는 스트림은 이러한 스트림의 정의에 어긋나지는 않는다.

Stream API의 스트림

한편 데이터 소스를 스트림으로 만들어 작업하기 위한 기능을
제공하는 Stream API에서 사용하는 스트림은 I/O Stream의 스트림 인스턴스와는 구분된다.

Stream API을 통해 만들어지는 스트림은 말 그대로 '데이터의 흐름'이며, 위에서 설명한 스트림의 정의에 부합한다고 볼 수 있다.
이 흐름이라는 개념은 다양한 의미를 함축하고 있는데,
기본적으로 불순물이 섞이지 않은 일련의 흐름을 구성하기 위해
동일한 형식을 지닌 복수의 데이터가 필요하다는 점을 의미하며,
스트림이 흘러가는 과정에서 데이터가 순차적으로 하나씩 사용되고, 사라지게 된다는 의미도 담겨 있다.