스트림이란?

List를 정렬할 때는 Collection.sort()를 사용해야하고, 배열을 정렬할 때는 Arrays.sort()를 사용해야한다.

이러한 문제점을 해결하기 위해 만든 것이 스트림이다.

스트림은 데이터소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드를 정의해 놓았다.

데이터 소스를 추상화 하였다는 것은, 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 되었다는 것과 코드의 재사용성이 높아진다는 것을 의미하는 바이다.

스트림을 이용하면, 배열이나 컬렉션뿐만 아니라 파일에 저장된 데이터도 모두 같은 방식으로 다룰 수 있게 된다. 정리하자면,

프로그래밍에서 일반적으로 연속된 데이터의 흐름을 처리하는 방식을 말한다. 이는 파일에서 문자를 읽어오거나, 네트워크를 통해 데이터를 전송하거나, 메모리에 저장된 배열로부터 요소를 가져오는 등 다양한 상황에서 사용한다는 것이다.

과정

  1. 스트림을 사용하여 데이터 소스로부터 정보(데이터)를 가져옴
  2. 가져온 정보(데이터)를 원하는 기준에 따라 정렬
  3. 그 결과(정렬된 정보/데이터)를 화면에 출력

<aside> 💡 참고, 만약 데이터 소스를 기반으로 하는 스트림을 생성한 후, 스트림으로 데이터 소스의 데이터를 읽어서 정렬하고 화면에 출력한다면, 어떻게 되는 것일까? → 데이터 소스가 정렬되는 것은 아니다. 그럼 이게 무슨 말 일까? → 즉, 데이터 소스 자체가 정렬된다는 것이 아니라, 데이터 소스로부터 읽어들인 데이터를 스트림을 통해 정렬하고 화면에 출력한다는 것이다. 쉽게 설명하면, 원본인 '데이터 소스'가 변경되지 않는다는 말이며, 즉 원본의 순서나 구조가 바뀌지 않으고, 단지 그것의 복사본이 정렬되고 화면에 출력될 뿐이란 소리다.

</aside>

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

스트림은 데이터 소스로 부터 데이터를 읽기만 할 뿐, 데이터 소스를 변경하지 않는다는 차이가 있다. 필요하다면, 정렬된 결과를 컬렉션이나 배열에 담아서 반환할 수 있다.

스트림은 일회용이다.

스트림은 Iterator처럼 일회용이다.

Iterator로 컬렉션의 요소를 모두 읽고 나면 다시 사용할 수 없는 것처럼, 스트림도 한 번 사용하면 닫혀서 다시 사용 할 수 없게 된다. 필요하다면 스트림을 다시 생성 해야한다.

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

스트림을 이용한 작업이 간결할 수 있는 비결중의 하나가 바로 ‘내부 반복’이다.

내부 반복이라는 것은 반복문을 메서드의 내부에 숨길 수 있다는 것을 의미한다.