자바 스트림(Stream)이란?🧐
스트림은 JDK8부터 추가된 기능 중 하나로, 컬렉션 인스턴스에 함수를 조합하여 원하는 결과를 필터링하고 가공된 결과를 손쉽게 처리할 수 있는 기능을 제공한다. 함수형 프로그래밍 개념을 지원하며 데이터 처리를 간결하고 효율적으로 할 수 있도록 도와준다.
다음은 배열에서 b의 개수를 찾는 과정을 Stream을 사용한 것과 그렇지 않은 것을 비교한 것이다.
Stream 사용 X
List<String> strings = Arrays.asList("a", "b", "b", "c");
int countWithoutStream = 0;
for (String str : strings) {
if (str.equals("b")) {
countWithoutStream++;
}
}
Stream 사용
List<String> strings = Arrays.asList("a", "b", "b", "c");
int countWithStream = (int) strings.stream()
.filter(s -> s.equals("b"))
.count();
예시를 통해 볼 수 있듯이 Stream 을 활용하면 데이터 처리를 간결하고 효율적으로 할 수 있다.
🎯 특징
원본 데이터를 변경하지 않는다.
기존의 데이터와는 별도로 사용되기 때문에 스트림의 결과를 이후에도 사용하려면 별도의 변수에 할당을 해줘야 한다.
내부 반복으로 작업을 처리한다.
개발자가 코드로 직접 컬랙션 요소를 반복해서 가져올 필요 없이 컬랙션 내부에서 요소들을 반복해서 처리할 수 있다. 이를 통해 효율적으로 데이터를 처리할 수 있고, 개발자는 요소를 어떻게 반복시킬지 상관 쓰지 않고 오로지 요소 처리에만 집중할 수 있다.
🏛️ 스트림 연산 구조
연산의 파이프 라인은 스트림 생성(Create) → 중간연산(Intermediate operating) → 최종연산(Final operation)의 형태를 가지며 이들은. 를 이용한 메서드 체이닝(Method Chanining)으로 구현된다.
Collections같은 객체 집합.스트림생성().중간연산().최종연산()
- 중간연산 메서드는 리턴 타입이 스트림이므로 계속해서 다른 스트림 메서드를 연결해 사용할 수 있음.
- 최종연산 메서드는 리턴 타입이 스트림이 아닌 것으로 메서드 체이닝을 끝내는 역할을 함.
- 최종연산이 실행되어야 중간연산도 처리되기 때문에 중간연산들만으로 구성된 메서드 체인은 실행되지 않음.
🤔 그래서 스트림을 왜 쓰는 거야?
- 추상화
- 스트림은 다양한 데이터 소스와 동작을 처리할 수 있는 공통 인터페이스를 제공하고, 이를 통해 데이터 구조의 세부 사항에 대해 몰라도 같은 방법으로 데이터 처리 작업을 효율적으로 수행할 수 있다.
- 즉, 기존에는 저장된 데이터에 접근하기 위해 반복문 등을 사용해 접근해야 했고 이렇게 작성된 코드는 가독성저하 및 재사용이 불가능하며 정형화된 처리패턴이 없어 데이터마다 다른 방법으로 접근해야 했던걸 개선했다.
- 가독성
- 스트림은 함수형 프로그래밍 스타일을 지원하며, 이를 통해 간결하고 가독성 좋은 코드를 작성할 수 있다.
- 성능 최적화
- 스트림은 지연 연산(Lazy Evaluation)을 통해 필요한 시점에만 데이터 처리를 수행한다.
- 병렬처리
- 따로 병렬처리 로직을 작성할 필요 없이 간단한 메서드를 이용해 병렬처리를 지원한다.
Stream 활용!
Stream 활용에 대해서는 아래 링크에서 너무 잘 설명되어 있어서 참고하며 좋을 것 같다!
https://mangkyu.tistory.com/114
🌐 Reference
'개발 스토리' 카테고리의 다른 글
[우테코 API] Assetions, NsTest 에 대해 알아보기 (1) | 2023.10.26 |
---|---|
컬렉션 프레임워크(Collection Framework) 은 뭐지?? (1) | 2023.10.23 |
MVC 패턴에 대해, 그리고 이를 지키는 규칙 (2) | 2023.10.21 |
레코드(record) 누구냐 넌? (2) | 2023.10.20 |
Git 의 기본 동작과 Fork vs Clone (2) | 2023.10.20 |