Java์์์ ์คํธ๋ฆผ(Stream)์ Java 8๋ถํฐ ๋์ ๋ ๊ธฐ๋ฅ์ผ๋ก, ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ๊ฐ๋ ฅํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋๋ฐ ์ค์ ์ ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ API๋ก์, ์ปฌ๋ ์ (๋ฆฌ์คํธ, ์ธํธ, ๋งต ๋ฑ)์ด๋ ๋ฐฐ์ด ๋ฑ์ ๋ค์ํ ๋ฐ์ดํฐ ์์ค๋ฅผ ํ์คํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฃฐ ์ ์๊ฒ ํด์ค๋๋ค.
์คํธ๋ฆผ? ๋ค์ํ ๋ฐ์ดํฐ ์์ค(์ปฌ๋ ์ , ๋ฐฐ์ด)๋ฅผ ํ์คํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ค๋ฃจ๊ธฐ ์ํ ๊ฒ
์คํธ๋ฆผ(Stream)์ ์ค๊ฐ ์ฐ์ฐ(Intermediate Operations)๊ณผ ์ต์ข ์ฐ์ฐ(Terminal Operations)์ผ๋ก ๋๋์ด์ง๋๋ฐ, ์ค๊ฐ ์ฐ์ฐ์ ์คํธ๋ฆผ์ ๋ณํํ๊ฑฐ๋ ํํฐ๋งํ๋ ์์ ์ ์ํํ๊ณ , ์ต์ข ์ฐ์ฐ์ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ฑฐ๋ ์คํธ๋ฆผ์ ๋ซ๋ ๋ฑ์ ์์ ์ ์ํํฉ๋๋ค.
์คํธ๋ฆผ ์ฃผ์ ํน์ง
- ๋ด๋ถ ๋ฐ๋ณต (Internal Iteration): ์คํธ๋ฆผ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณตํ๋ ๋ฐฉ์์ธ ๋ด๋ถ ๋ฐ๋ณต์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ๋ช ์์ ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์์ฑํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ง์ฐ ํ๊ฐ (Lazy Evaluation): ์คํธ๋ฆผ์ ์ง์ฐ ํ๊ฐ๋ฅผ ํตํด ํ์ํ ์์ ๊น์ง ์ฐ์ฐ์ ์ํํ์ง ์์ต๋๋ค. ์ด๋ ์ค๊ฐ ์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ํธ์ถํ๋๋ผ๋ ์ค์ ๋ก ์ฒ๋ฆฌ๋ ์ต์ข ์ฐ์ฐ์ด ํธ์ถ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ํ์ดํ๋ผ์ด๋ (Pipelining): ์คํธ๋ฆผ์ ์ฌ๋ฌ ์ค๊ฐ ์ฐ์ฐ๊ณผ ์ต์ข ์ฐ์ฐ์ ์ฒด์ด๋(Chaining)ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ๊ณ ๊ฐ๋ ์ฑ ์๊ฒ ์ ์งํ ์ ์์ต๋๋ค.
์ค๊ฐ ์ฐ์ฐ (Intermediate Operations)
์ค๊ฐ ์ฐ์ฐ์ ์คํธ๋ฆผ์ ๋ณํํ๊ฑฐ๋ ํํฐ๋งํ๋ ์ฐ์ฐ์ผ๋ก, ์ฌ๋ฌ ๋ฒ ์ฐ์ํด์ ํธ์ถํ ์ ์์ผ๋ฉฐ, ํธ์ถ ์์์ ๋ฐ๋ผ ์ฐ์ฐ์ด ์ ์ฉ๋ฉ๋๋ค. ์ค๊ฐ ์ฐ์ฐ์ ์๋ก์ด ์คํธ๋ฆผ์ ๋ฐํํ๋ฏ๋ก ์ฒด์ด๋(Chaining)์ ํตํด ์ฌ๋ฌ ์ฐ์ฐ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ ์ฝ๋์์๋ ์ ์ ๋ฆฌ์คํธ์์ ์ง์๋ง ํํฐ๋งํ๊ณ ๊ฐ ์์๋ฅผ ์ ๊ณฑํ๋ ์ค๊ฐ ์ฐ์ฐ์ด ์ํ๋ฉ๋๋ค.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> evenSquared = numbers.stream()
.filter(n -> n % 2 == 0) // ์ค๊ฐ ์ฐ์ฐ: ์ง์๋ง ํํฐ๋ง
.map(n -> n * n) // ์ค๊ฐ ์ฐ์ฐ: ๊ฐ ์์ ์ ๊ณฑ
.collect(Collectors.toList()); // ์ต์ข
์ฐ์ฐ: ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์คํธ๋ก ์์ง
System.out.println(evenSquared); // [4, 16, 36, 64, 100]
1) ๋ฐ์ดํฐ ์์ค ๋ณ๊ฒฝ ์์: ์คํธ๋ฆผ์ ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํ๊ณ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค. ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ค๊ฐ ์ฐ์ฐ๊ณผ ์ต์ข
์ฐ์ฐ์ ํตํด ํํฐ๋ง, ๋ณํ ๋๋ ์ง๊ณ ์์
์ ์ํํฉ๋๋ค.
2) ๋ด๋ถ ๋ฐ๋ณต (Internal Iteration): ์คํธ๋ฆผ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ ์์๋ฅผ ๋ฐ๋ณต ์ฒ๋ฆฌํ๋ ๋ด๋ถ ๋ฐ๋ณต์ ์ํํฉ๋๋ค. ๋ด๋ถ ๋ฐ๋ณต์ ๊ฐ๋ฐ์๊ฐ ๋ช
์์ ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์์ฑํ์ง ์๊ณ ๋ ์คํธ๋ฆผ API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์์์ ์ ๊ทผํ๊ณ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
์์ ์ฝ๋์์ stream ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ๋ฆฌ์คํธ๋ก๋ถํฐ ์คํธ๋ฆผ์ ์์ฑํ๊ณ , forEach ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ฐ ์์๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ์ด๋, ๊ฐ๋ฐ์๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ ๋ ์คํธ๋ฆผ์ ํตํด ๋ฐ์ดํฐ ์์์ ์ ๊ทผํ์ฌ ์ถ๋ ฅ ์์
์ ์ํํ ์ ์์ต๋๋ค. ๋ด๋ถ ๋ฐ๋ณต์ ์ฌ์ฉํ๋ ์คํธ๋ฆผ์ ์ฅ์ ์ ๊ฐ๋ฐ์๊ฐ ์์์ ์ง์คํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ฐ๋ณต ๋ก์ง์ ์ง์ ์์ฑํ๋ ๋์ , ์คํธ๋ฆผ API๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋จํ๊ณ ๊ฐ๋
์ฑ ์๊ฒ ํํํ ์ ์์ต๋๋ค. ๋ด๋ถ ๋ฐ๋ณต์ ์คํธ๋ฆผ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ๊ฐ์ ์ต์ ํ ์์
์๋ ์ ๋ฆฌํ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
3) ๋ณ๋ ฌ ์ฒ๋ฆฌ (Parallel Processing): ์คํธ๋ฆผ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ง์ํ์ฌ ์์
์ ๋์์ ์ฌ๋ฌ ์ค๋ ๋์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ณ๋ ฌ ์คํธ๋ฆผ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ฒญํฌ๋ก ๋ถํ ํ์ฌ ๋์์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
์์ ์ฝ๋์์ parallelStream() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๋ ฌ ์คํธ๋ฆผ์ ์์ฑํ๊ณ , mapToInt๋ฅผ ํตํด ๊ฐ ์์๋ฅผ ์ ์๋ก ๋ณํํ ํ sum()์ ํธ์ถํ์ฌ ๋ชจ๋ ์์์ ํฉ์ ๊ณ์ฐํฉ๋๋ค. ๋ณ๋ ฌ ์คํธ๋ฆผ์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ฒญํฌ๋ก ๋ถํ ํ์ฌ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ๋ฉํฐ์ค๋ ๋ฉ์ ํ์ฉํ์ฌ ์์
์ ๋์์ ์ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ ๋ชจ๋ ์ํฉ์์ ์ฑ๋ฅ ํฅ์์ ๋ณด์ฅํ๋ ๊ฒ์ ์๋๋๋ค. ๋ฐ์ดํฐ ๋ถํ ๋ฐ ์กฐํฉ์ ๋ฐ๋ฅธ ์ค๋ฒํค๋, ๋๊ธฐํ์ ํ์์ฑ ๋ฑ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ์์ผ๋ฏ๋ก, ์ ์ ํ ์ํฉ์์ ์ ์ฉํด์ผ ํฉ๋๋ค.
4) ์ต์ข
์ฐ์ฐ (Terminal Operations): ์คํธ๋ฆผ์ ์ต์ข
๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๊ฑฐ๋, ์คํธ๋ฆผ์ ๋ซ๋ ๋ฑ์ ์์
์ ์ํํฉ๋๋ค. ์ต์ข
์ฐ์ฐ์ ํ ๋ฒ๋ง ํธ์ถ๋์ด์ผ ํ๋ฉฐ, ํธ์ถ๋๋ฉด ์คํธ๋ฆผ์ ๋ซํ๊ฒ ๋ฉ๋๋ค.
์์ ํน์ง๋ค์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์์น์ ๋ฐ๋ฅด๋ฉฐ, ๋ถ๋ณ์ฑ๊ณผ ๋ด๋ถ ๋ฐ๋ณต์ ๊ฐ์กฐํ์ฌ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋
์ฑ ์๊ฒ ์์ฑํ ์ ์๋๋ก ๋์ต๋๋ค.
Java streams represent a pipeline through which data will flow and the functions to operate on the data.
Java streams enable functional-style operations on streams of elements. A stream is an abstraction of a non-mutable collection of functions applied in some order to the data. A stream is not a collection where you can store elements.
'Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
27 Functional Interface (feat. Lambda) (1) | 2024.01.21 |
---|---|
26 Thread (1) | 2024.01.21 |
25 Generics (1) | 2024.01.21 |
24 Enum (0) | 2024.01.21 |
23 Annotation (1) | 2024.01.21 |
๋๊ธ