Stream이란?
Intellij 같은 IDE에서 Java를 사용하다보면 자동완성으로 stream을 자주 볼 수 있다. Stream은 컬렉션들을 iterating 해주는 기능인데 for문을 사용하지 않고 직관적으로 흐름에 따라서 코드를 작성할 수 있다. Stream에서 제공해주는 메소드들이 많이 있기 때문에 잘 활용한다면 복잡한 로직도 읽기 쉽게 코딩할 수 있다.
특징
1. Stream은 데이터를 변경하지 않는다. 데이터를 단순히 읽어서 그 데이터를 가지고 새로운 배열을 만들어낸다. 다시 말하면 원본 데이터는 수정되지 않는다.
2. Stream은 한 번 열렸다가 닫히면 사라진다. 1번의 특징처럼 원본 데이터는 변경되지 않고 한 번 iterate 되고 따로 새로운 컬렉션을 리턴하지 않으면 그대로 사라져 재사용이 불가능하다.
3. Stream은 내부 반복으로 작업을 처리한다. 쉽게 말해서 list.get(i) 같은 처리가 필요 없이 item -> item.doSomething() 같은 구조로 이루어져 있어서 더욱 간결하게 작업을 처리할 수 있다. 개발자는 반복은 자바에게 맡기고 로직에 집중할 수 있다.
4. Stream은 선언형 코드로 구현할 수 있어서 요구사항이 변해도 쉽게 대응이 가능하다. 또 선언형이기 때문에 간결하고 가독성이 좋다.
5. Stream은 중간처리, 최종 처리 등의 과정을 거쳐서 원하는 결과를 만들어낼 수 있다. for 문을 사용하면 for 문을 몇 번이나 선언해야 가능하지만 Stream을 사용하면 매우 간결하게 처리할 수 있다.
6. Stream은 병렬처리가 가능하다. .stream()이 아니라 .parallelSream()을 사용하면 CPU의 코어 개수 만큼 스트림이 생겨서 병렬로 처리가 가능하다. 병렬 처리라고 항상 빠른 것은 아니니 상황에 따라 사용할 줄 알아야한다. 병렬 처리는 컬렉션의 데이터 수, 각 로직의 처리 시간에 따라 성능이 달라지는데 데이터 수가 많고 처리 시간이 오래 걸릴 수록 병렬 처리가 빨라진다. 또 데이터구조의 특성상 index가 있는 데이터구조의 성능이 빠르다. 만약 싱글코어를 사용하고 있다면 병렬처리보다 직렬처리가 더 빠르다.
중개 연산
Stream에서 중개연산은 실제 로직을 구현한 부분이라고 생각하면 된다. filter, distinct, map, flatMap, limit, skip, sorted, peek, 등의 연산을 사용할 수 있고 필요에 따라 적절한 메소드를 활용하면 된다. 중간 연산의 특징은 여러개의 중간 연산을 하나의 스트림에 사용할 수 있다는 것이다. 예를 들면 .stream().map().filter().skip().. 이렇게 연속된 중간 연산을 하는 것이 가능하다. 중간 연산이 들어가면 하나의 원소는 마지막 중간연산까지 한 번에 처리가 되고 마무리가 되면 다음 원소가 처리되는 순서로 진행된다. 각 연산을 어떻게 사용하는지는 추후에 포스팅을 통해 알아보도록하겠다.
최종 연산
Stream에서 최종 연산은 로직을 모두 타고 완료된 요소들을 최종적으로 처리하는 부분이다. 최종 연산에서는 forEach, reduce, findFirst, findAny, anyMatch, count, min, max, sum, average, collect, 등 다양한 연산을 활용할 수 있다. 이 연산들에 대해서도 추후에 다른 포스팅에서 알아보도록하겠다.
'Java' 카테고리의 다른 글
Java - Functional Interface란? (모던 자바 인 액션 참고) (0) | 2022.08.19 |
---|---|
Spring - @RestController와 @Controller의 차이 (0) | 2022.08.11 |
Java - Wrapper Class란 (0) | 2022.08.08 |
Java - Abstract Class와 Interface의 차이 (0) | 2022.08.04 |
Java - String pool (0) | 2022.08.03 |