성장에 목마른 코린이

[Java8] 스트림과 컬렉션의 차이 본문

Java

[Java8] 스트림과 컬렉션의 차이

성장하는 코린이 2022. 10. 21. 11:17
728x90

기존 루프문 처리의 문제점

기존 Java에서 컬렉션 데이터를 처리할때는 for, foreach 루프문을 사용하면서 컬렉션 내의 요소들을 하나씩 다루었습니다.

가단한 처리나 컬렉션의 킉가 작으면 큰 문제가 아니지만 복잡한 처리가 필요하거나 컬렉션의 크기가 커지면,

루프문의 사용은 성능저하를 일으키게 되었습니다.

 

스트림의 등장

스트림은 Java8에서 추가된 기능으로 컬렉션 데이터를 선언형으로 쉽게 처리할 수 있습니다.

복잡한 루프문을 사용하지 않아도 되며, 루프문을 중첩해서 사용해야 되는 최악의 경우도 더이상 없어졌습니다.

또한 스트림은 병렬처리(Multi thread)를 별도의 멀티 스레드 구현없이도 쉽게 구현할 수 있습니다.

 

스트림과 컬렉션의 차이

1. 데이터 계산 시점

컬렉션: 모든 요소는 컬렉션에 추가하기전에 계산되어야 합니다.

스트림: 요청할때만 요소를 계산하는 고정된 자료구조

 

사용자가 요청하는 값만 추출할수 있는 특성때문에 스트림은 컬렉션보다 프로그래밍에 장점이 있습니다.

 

2. 반복의 일회성

컬렉션: 같은 소스에 대하여 여러번 반복 처리를 할 수 있습니다.

스트림: 소비의 개념을 쓰기 때문에 한번 소비한 요소에 대해 접근 할 수 없어 단 한번만 반복문을 처리할 수 있습니다.

 

3. 외부반복, 내부반복

컬렉션: foreach 문법을 사용해 사용자가 반복문을 직접 명시해햐하는데 이를 외부반복이라고 합니다.

스트림: 라이브러리를 사용하는 내부반복개념입니다.

 

스트림 연산

스트림 연산들은 크게 중간연산, 최종연산으로 구분할 수 있습니다.

중요한 특징은 최종연산을 실행하기 전까지는 아무 연산도 수행하지 않는다는 것 입니다.

- 중간연산: filter나 map같은 중간 연산은 다른 스트림을 반환하기에 여러개의 중간연산을 연결해 질의를 만들 수 있습니다.

- 최종연산: 파이프라인 연산의 결과를 출력합니다. List, Integer, void 등 다양한 형태로 출력할 수 있습니다.

 

스트림 이용하기 요약

1. 질의를 수행할 데이터소스 (ex. 컬렉션)

2. 스트림 파이프라인을 구성할 중간연산

3. 스트림 연산을 실행하고 결과로 출력할 최종연산

Comments