스트림이란 한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임이다. 이론적으로 프로그램은 입력 스트림에서 데이터를 한 개 씩 읽어 들이며 마찬가지로 출력 스트림으로 데이터를 한 개 씩 기록한다.
자바 8에는 java.util.stream
패키지에 스트림 API가 추가되었다. 자바 8에서는 스레드라는 복잡한 작업을 사용하지 않으면서도 공짜로 병렬성을 얻을 수 있다.
일급 시민(일급 객체)란 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다.
[위키백과]
함수형 프로그래밍에서의 1급 시민(혹은 1급 객체)의 충족 조건은 3가지가 있다.
1. 변수나 데이터에 할당할 수 있다.
2. 객체의 인자로 전달할 수 있다.
3. 반환값으로 전달할 수 있다.
함수형 프로그래밍에서는 함수자체가 일급 시민이다. 자바 8에서는 함수형 프로그래밍 언어를 사용함으로써 메서드와 람다를 일급 시민으로 사용할 수 있게 되었다.
File[] hiddenFiles = new File(".").listFiles(new FileFilter() {
public boolean accept(File file) {
return file.isHidden();
}
});
위와 같이 완성 된 코드를 자바 8에서는 다음과 같이 구현할 수 있다.
File[] hiddenFiles = new File(".").listFiles(File::isHidden);
자바 8에서는 메서드 참조를 이용하여 listFiles()
라는 메서드에 isHidden이라는 함수를 직접 전달할수 있다.
자바 8에서는 더 이상 메서드가 이급값이 아닌 일급값이다. 기존에 객체 참조를 이용해서 객체를 이리저리 주고받았던 것 처럼 자바 8에서는 메서드 참조를 만들어 전달할 수 있게 되었다.
람다식(Lambda Expression)이란 함수를 하나의 식(expression)으로 표현한 것이다. 함수를 람다식으로 표현하면 메서드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류라고 볼 수 있다. 익명함수들 또한 모두 일급 객체이다.
스트림이란 데이터소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해 놓았다. 데이터 소스를 추상화하였다는 것은, 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 되었다는 것과 코드의 재사용성이 높아진다는 것을 의미한다.
스트림은 데이터 소스를 변경하지 않는다.
: 스트림은 데이터 소스로 부터 데이터를 읽기만할 뿐, 데이터 소스를 변경하지 않는다는 차이가 있다.
스트림은 일회용이다.
: 스트림은 Iterator처럼 일회용이다. Iterator로 컬렉션의 요소를 모두 읽고 나면 다시 사용할 수 없는 것처럼, 스트림도 한번 사용하면 닫혀서 다시 사용할 수 없다.
스트림은 작업을 내부 반복으로 처리한다.
: 내부 반복이라는 것은 반복문을 메서드의 내부에 숨길 수 있다는 것을 의미한다. 스트림을 이용하면 루프를 신경 쓸 필요가 없다. 스트림에서는 라이브러리 내부에서 모든 데이터가 처리된다.
참고자료