Lambda & Stream
Java ๋๋ค ํํ์๊ณผ Stream API
JAVA 8 ์์ ๋๋ค ํํ์(Lambda Expression) ๊ณผ ์คํธ๋ฆผ API(Stream API) ๊ฐ ๋์ ๋๋ฉด์, ์๋ฐ ์ธ์ด๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ ๋ถ๋ถ์ ์ผ๋ก ๋ฐ์๋ค์ด๊ณ ๋ณด๋ค ์ ์ธ์ ์ธ ์ฝ๋ ์์ฑ์ ์ง์ํ๊ฒ ๋์์. ์ด๋ก์จ ๊ฐ๋ฐ์๋ ๋ฐ๋ณต๋ฌธ์ด๋ ์ต๋ช ํด๋์ค์ ์์กดํ๋ ๋ฐฉ์์ ๋ฒ์ด๋, ์ฝ๋์ ๊ฐ๊ฒฐ์ฑ ๊ณผ ๊ฐ๋ ์ฑ ์ ๋์ด๊ณ ๋ฉํฐ์ฝ์ด ํ์ฉ ๋ฑ์ ํจ์จ์ฑ ๋ ๊ฐ์ ํ ์ ์๊ฒ ๋์์. ์๋์์๋ ๋๋ค ํํ์๊ณผ ์คํธ๋ฆผ API ์ ๊ฐ๊ฐ์ ๊ฐ๋ ์ ์, ๋์ ๋ฐฐ๊ฒฝ, ๋ฌธ๋ฒ, ์ฅ๋จ์ , ํ์ฉ ์ฌ๋ก๋ฅผ ์ค๋ช ํ ๊ฑฐ์.
Lambda Expression
์ ์์ ๋์
๋ฐฐ๊ฒฝ
๋๋ค ํํ์ ์ ๋ฉ์๋(ํจ์)๋ฅผ ํ๋์ ์(expression) ์ผ๋ก ํํํ๋ ๋ฌธ๋ฒ์ผ๋ก, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋จ์ผ ๋ฉ์๋ ์ธํฐํ์ด์ค (Functional Interface) ์ ์ต๋ช
๊ตฌํ์ฒด์ ๋๋ฑํ ๊ธฐ๋ฅ์ ์ํํจ. ๋ค์ ๋งํด, ๋๋ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ํตํด ๋์ ์์ฒด๋ฅผ ์ผ๊ธ ๊ฐ์ฒด ์ฒ๋ผ ๋ค๋ฃฐ ์ ์์ด์, ๋ฉ์๋์ ์ธ์๋ก ํจ์ํ ๋์์ ์ง์ ์ ๋ฌํ๊ฑฐ๋ ๋ณ์์ ํ ๋นํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง. Java 8 ์ด์ ์๋ ์ด๋ฌํ ๋์ ์ ๋ฌ์ ์ํด ์ต๋ช
ํด๋์ค(์ต๋ช
๋ด๋ถ ํด๋์ค)๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ฝ๋๊ฐ ์ฅํฉํด์ง๊ณ ๋ถํธํ๋ค๋ ๋ฌธ์ ๊ฐ ์์์. ์๋ฅผ ๋ค์ด ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ ์ปฌ๋ ์
์ ๋ ฌ์ ์ํด ๊ฐ๋จํ ์์
์ด๋ผ๋ ActionListener ๋ Comparator ์ธํฐํ์ด์ค๋ฅผ ์ต๋ช
ํด๋์ค ํํ๋ก ๊ตฌํํด์ผ ํ์. ๋๋ค ํํ์์ ์ด๋ฌํ ๋ถํธํจ์ ํด์ํ๊ธฐ ์ํด ๋ฑ์ฅํ์ผ๋ฉฐ, ์๋ฐ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฅ์ ์ ํก์ํ์ฌ ๋์ ํ๋ผ๋ฏธํฐํ(behavior parameterization) ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์๊ฒ ๋์์. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ณํํ๋ ์๊ตฌ์ฌํญ์ ์ ์ฐํ๊ฒ ๋์ํ๊ณ , ๋ถํ์ํ ์ฝ๋ ์ค๋ณต๊ณผ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ฐ ํฌ๊ฒ ๊ธฐ์ฌํ์์.
๋ฌธ๋ฒ๊ณผ ์ฌ์ฉ ๋ฐฉ๋ฒ
Java ์์ ๋๋ค ํํ์์ ํจ์ํ ์ธํฐํ์ด์ค (์ถ์ ๋ฉ์๋๊ฐ ํ๋๋ง ์ ์ธ๋ ์ธํฐํ์ด์ค) ์ ๊ตฌํ์ ์ฝ๊ฒ ํํํ๋ ์์ผ๋ก ์ฌ์ฉ๋จ. ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์.
(๋งค๊ฐ๋ณ์ ๋ชฉ๋ก) -> { ํจ์ ๋ณธ๋ฌธ }๋งค๊ฐ๋ณ์ ๋ชฉ๋ก : ํจ์์ ์ ๋ฌ๋ ๋งค๊ฐ๋ณ์๋ฅผ ๋์ดํจ. ๋งค๊ฐ๋ณ์๊ฐ ํ๋์ด๋ฉด ๊ดํธ
()๋ฅผ ์๋ตํ ์ ์์.->: ๋๋ค ํ์ดํ ์ฐ์ฐ์๋ก ๋งค๊ฐ๋ณ์์ ํจ์ ๋ณธ๋ฌธ์ ๊ตฌ๋ถํจ.ํจ์ ๋ณธ๋ฌธ : ์ฃผ์ด์ง ๋งค๊ฐ๋ณ์๋ฅผ ์ด์ฉํด ์ํํ ๋ก์ง์ ์ ์ํจ. ํ ์ค๋ก ํํ๋๋ ๊ฒฝ์ฐ ์ค๊ดํธ
{}๋ฅผ ์๋ตํ ์ ์์ผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ด ๋๋ค์ ๋ฐํ๊ฐ์ด ๋จ. ์ฌ๋ฌ ์ค๋ก ์ด๋ฃจ์ด์ง ๊ฒฝ์ฐ{}๋ธ๋ก ๋ด์ ์์ฑํ๊ณreturn๋ฌธ์ ์ฌ์ฉํจ.
๋๋ค ํํ์์ ํ๊ฒ ํ์
๋ฌธ๋งฅ, ์ฆ ๋ณ์ ์ ์ธ์ด๋ ๋ฉ์๋ ์ธ์ ๋ฑ์ ์์น์์ ํด๋น ๋๋ค์ ํธํ๋๋ ํจ์ํ ์ธํฐํ์ด์ค์ ํ์
์ ํตํด ์ฌ์ฉ๋จ. ์๋ฅผ ๋ค์ด Runnable ์ธํฐํ์ด์ค๋ ์ธ์๊ฐ ์๊ณ ๋ฐํ๊ฐ์ด ์๋ run() ์ถ์ ๋ฉ์๋๋ฅผ ๊ฐ๋๋ฐ, ์ด๋ฅผ ๋๋ค๋ก ํํํ๋ฉด () -> {...} ํํ๊ฐ ๋จ. ๊ฐ๋จํ ์ฌ์ฉ ์๋ฅผ ํตํด ๋น๊ตํด๋ณด๋ฉด:
// Java 8 ์ด์ : ์ต๋ช
ํด๋์ค๋ก ์ฐ๋ ๋ ์คํ
Thread th1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello, World!");
}
});
th1.start();
// Java 8 ์ดํ : ๋๋ค ํํ์์ผ๋ก ์ฐ๋ ๋ ์คํ
Thread th2 = new Thread(() -> System.out.println("Hello, World!"));
th2.start();์ ์ฝ๋์์ ๋ณผ ์ ์๋ฏ์ด, ๋๋ค๋ฅผ ์ฌ์ฉํ๋ฉด ์ต๋ช
ํด๋์ค ๊ตฌํ์ ๋นํด ๊ตฌ๋ฌธ์ด ํจ์ฌ ๊ฐ๊ฒฐ ํด์ง. ์ด ์ธ์๋ ๋๋ค๋ Comparator ์ ๊ฐ์ด ํ๋์ ๋ฉ์๋๋ง ๊ฐ์ง ์ธํฐํ์ด์ค ๊ตฌํ์ ๋๋ฆฌ ์ฌ์ฉ๋จ. ์๋ฅผ ๋ค์ด ๋ฆฌ์คํธ ์ ๋ ฌ์ ์ํ ๋น๊ต์๋ฅผ ๋๋ค๋ก ์ฝ๊ฒ ์ ๊ณตํ ์ ์์.
List<String> fruits = Arrays.asList("banana", "apple", "cherry");
// ๋๋ค๋ฅผ ์ฌ์ฉํ ์ ๋ ฌ: ๋ฌธ์์ด ๊ธธ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
fruits.sort((a,b) -> a.length() - b.length());
System.out.println(fruits); // result : [apple, banana, cherry]์์ sort ํธ์ถ์์ ๋๋ค (a,b) -> a.length() - b.length() ๋ Comparator<String> ์ compare(String o1, String o2) ๋ฉ์๋ ๊ตฌํ์ ํํํ ๊ฒ์. ์ด์ฒ๋ผ ๋๋ค ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์ต๋ช
ํด๋์ค ์ ์ธ์ ์ง์ ํ์ง ์๊ณ ๋ ํ์ํ ๋์์ ์ ๋ฌํ ์ ์์. ๋ํ ใน๋ง๋ค ๋ด๋ถ์์๋ ์ธ๋ถ ์ง์ญ๋ณ์ ๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ฐ, ์ด ๊ฒฝ์ฐ ํด๋น ๋ณ์๋ ์๋์ผ๋ก effectively final(์ฌ์ค์ ์์) ๋ก ์ทจ๊ธ๋์ด ๋๋ค์์ ์์ ํ๊ฒ ํ์ฉ๋จ.
์ฅ์
์ฝ๋ ๊ฐ๊ฒฐ์ฑ ํฅ์ : ๋๋ค ํํ์์ ๋์ผํ ๊ธฐ๋ฅ์ ํ๋ ์ฝ๋๋ฅผ ํจ์ฌ ์งง๊ณ ๋ช ํํ๊ฒ ๋ง๋ค๋ฉฐ, ๋ณด์ผ๋ฌ ํ๋ ์ดํธ(boilerplate) ์ฝ๋๋ฅผ ์ค์ฌ์ค. ์ต๋ช ํด๋์ค ์ฌ์ฉ ๋๋น ์์ฑํด์ผ ํ ์ฝ๋๋์ด ํฌ๊ฒ ๊ฐ์ํ์ฌ ๊ฐ๋ ์ฑ์ด ๋์์ง.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ง์ : ํจ์ ์์ฒด๋ฅผ ๊ฐ์ผ๋ก ์ ๋ฌํ ์ ์์ผ๋ฏ๋ก, ๋ฉ์๋์ ์ธ์๋ก ๋์์ ๋๊ธฐ๊ฑฐ๋ ์ปฌ๋ ์ ์ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ์ ๋ต์ฒ๋ผ ๋ฐ๊ฟ ๋ผ์ฐ๋ ๋ฑ ๋์ ํ๋ผ๋ฏธํฐํ ๊ฐ ์ฌ์์ง.
ํํ๋ ฅ ์ฆ๊ฐ : ๋๋ค์ ํจ๊ป ๋์ ๋ ์คํธ๋ฆผ API ์ ๊ฒฐํฉํ์ฌ, ๋ณต์กํ ์ฐ์ฐ์ ์ ์ธ์ ์ด๊ณ ์ง๊ด์ ์ธ ๋ฐฉ์ ์ผ๋ก ํํํ ์ ์์. ๋ฌด์์ ํ ์ง์ ์ง์คํ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํด์ง๊ณ , loop ๋ ์กฐ๊ฑด๋ฌธ ๋ฑ์ ๊ตฌํ ์ธ๋ถ์ฌํญ์ ์จ๊ฒจ์ง.
๋ฉฑ๋ฑ์ฑ ๋ฐ ๋ฉํฐ์ค๋ ๋ ํ์ฉ : ๋๋ค๋ก ์ ๋ฌ๋๋ ํจ์๋ ๋ถ์์ฉ์ด ์๋๋ก ์์ฑ๋๋ ๊ฒ์ด ๊ถ์ฅ๋๋๋ฐ, ์ด๋ฐ ํน์ฑ ๋๋ถ์ ์คํธ๋ฆผ์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฅผ ํ ๋๋ ์์ ํ๊ฒ ์ ์ฉํ ์ ์์. ๋ํ ๋ณ๋ ฌ ์คํธ๋ฆผ ๋ฑ์ ์ฌ์ฉํ ๋ ๋ณ๋์ ์ค๋ ๋ ๊ด๋ฆฌ ์ฝ๋ ์์ด๋ ๋ฉํฐ์ฝ์ด ํ์ฉ์ด ๊ฐ๋ฅํด์ง.
ํ์ค ํจ์ํ ์ธํฐํ์ด์ค ํ์ฉ : ์๋ฐ 8 ์์๋
java.util.functionํจํค์ง์ ๋ค์ํ ์ฉ๋์ ํจ์ํ ์ธํฐํ์ด์ค(Consumer, Function, Predicate ๋ฑ) ๊ฐ ์ ๊ณต๋์ด ์์ด, ๋๋ค๋ฅผ ์ฌ์ฉํ ํ์คํ๋ ํ๋ก๊ทธ๋๋ฐ ์คํ์ผ์ ํ์ฉํ ์ ์์. ์ด๋ API ์ค๊ผ ๋ฐ ์ฌ์ฉ ์ธก๋ฉด์์ ์ผ๊ด์ฑ์ ๋ถ์ฌํจ.
๋จ์
์ด๊ธฐ ๊ฐ๋ ์ฑ ์ ํ : ๋๋ค ๋ฌธ๋ฒ์ด ์ต์ํ์ง ์์ ๊ฐ๋ฐ์์๊ฒ๋ ์คํ๋ ค ์ฝ๋์ ์๋ฏธ๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์์. ์ต๋ช ํด๋์ค์ ๋นํด ์ฝ๋์ ๋ช ์์ฑ์ด ๋จ์ด์ง ์ ์๋ค ๋ ์ง์ ๋ ์์ผ๋ฉฐ, ์ด๋ ์ธํฐํ์ด์ค์ ์ด๋ค ๋ฉ์๋๋ฅผ ๊ตฌํํ ๊ฒ์ธ์ง ๋ฐ๋ก ์๊ธฐ ์ด๋ ค์ ์ฒ์์ ํผ๋์ ์ค ์ ์์.
๋๋ฒ๊น ์ด๋ ค์ : ๋๋ค ํํ์ ์์ฒด์๋ ์ด๋ฆ์ด ์๊ณ ์ต๋ช ํจ์ ํํ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์, ๋๋ฒ๊ฑฐ๋ก ์ถ์ ํ ๋ ์คํ ํธ๋ ์ด์ค๊ฐ ์ง๊ด์ ์ด์ง ์์ ์ ์๊ณ , ๋๋ค ๋ด๋ถ์์ ์์ธ ๋ฐ์ ์ ์ด๋ ์ง์ ์ธ์ง ํ์ ์ด ๋ค์ ๊น๋ค๋ก์ธ ์ ์์. ๋ํ ๋๋ค ๋ด ์ฝ๋๋ ํ๋์ ํด๋ก์ (Closure) ๋ก ์ทจ๊ธ๋๋ฏ๋ก, ์ค๊ฐ์ ๋ณ์ ๊ฐ์ ์ฐ์ด๋ณด๊ฑฐ๋ ํ๊ธฐ๊ฐ ์ ํต์ ์ธ ๋ฃจํ์ ๋นํด ๋ฒ๊ฑฐ๋ก์.
์ ํ ์ฌํญ : ๋๋ค๋ ์ค์ง ํ๋์ ์ถ์ ๋ฉ์๋๋ง์ ๊ฐ์ง ์ธํฐํ์ด์ค ์ ๋ํด์๋ง ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก (
@FunctionalInterface), ๊ธฐ์กด์ ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ๊ฐ์ง ํ์ ์ ๋๋ค๋ก ์ง์ ๊ตฌํํ ์๋ ์์. ๋ํ ๋๋ค ๋ณธ๋ฌธ์์ checked ์์ธ ๋ฅผ ๋์ง๋ ค๋ฉด ํด๋น ์ธํฐํ์ด์ค์ ๊ทธ ์์ธ๊ฐ ์ ์ธ๋์ด ์์ด์ผ ํ๋ ๋ฑ์ ์์ธ ์ฒ๋ฆฌ ์ ํ์ด ์์.์ธ๋ถ ์ํ ๋ณ๊ฒฝ์ ์ ํ : ๋๋ค ๋ด๋ถ์์๋ ์ธ๋ถ ์ง์ญ ๋ณ์๋ฅผ ๋ณ๊ฒฝํ ์ ์์. (ํด๋น ๋ณ์๋ effectively final ์ด์ด์ผ ํจ.) ๋ฐ๋ผ์ ๋๋ค์ ๋ด๋ถ์์ ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ก์ง์ ์ปดํ์ผ ํ์์ ์ ํ๋๋ฉฐ, ์ด๋ฌํ ์ค๊ณ๋ ๋ถ์์ฉ์ ๋ฐฉ์งํ์ง๋ง ๋๋ก๋ ๋ถํธํจ์ผ๋ก ๋๊ปด์ง ์ ์์.(
AtomicInteger๋ ๋ฐฐ์ด ๋ฑ์ผ๋ก ์ฐํ ๊ฐ๋ฅํ์ง๋ง ๊ถ์ฅ๋์ง๋ ์์.)์ฑ๋ฅ ๋ฐ ์ปดํ์ผ ์ค๋ฒํค๋ : ๋๋ค ์์ฒด๋ ์๋ฐ ์ปดํ์ผ๋ฌ๊ฐ ๋ด๋ถ์ ์ผ๋ก invokedynamic ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๊ฑฐ๋ ์จ๊ฒจ์ง ํด๋์ค ํ์ผ์ ์์ฑํ์ฌ ์ฒ๋ฆฌํจ. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ก ์ธํ ์คํ ์ฑ๋ฅ ๋ถํ๊ฐ ํฌ์ง ์์ง๋ง, ์๋ฐ 8 ์ด๊ธฐ์๋ ๋๋ค ์ฌ์ฉ ์ ์ฒซ ํธ์ถ์ ์ฝ๊ฐ์ ์ง์ฐ์ด ์๋ค๋ ๋ณด๊ณ ๋ ์์์. ํ์ง๋ง JIT ์ต์ ํ๋ก ๋๋ถ๋ถ ์์๋๋ฉฐ, ๋๋ค ํํ์ ๊ทธ ์์ฒด๋ก ํฐ ์ฑ๋ฅ์์ ๋จ์ ์ ์์ ( ์ฃผ๋ก ์คํธ๋ฆผ ์ฌ์ฉ ์์ ์ค๋ฒํค๋๊ฐ ์ด์)
Stream API
Stream ์ ์๋ฐ 8 ์์ ์ปฌ๋ ์ ๋ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋์ ๋ ํจ์ํ API ์. ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ฉด ์ ์ธํ(declarative) ๋ฐฉ์์ผ๋ก ์ปฌ๋ ์ ์ ์์๋ค์ ๋ค๋ฃฐ ์ ์์ผ๋ฉฐ, ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ ๋ฉ์๋ ์ฒด์ด๋์ ํตํด ํ์ดํ๋ผ์ธ ํํ๋ก ๊ตฌํํ ์ ์์. ์คํธ๋ฆผ์ ํ๋ง๋๋ก ๋ฐ์ดํฐ ์์๋ค์ ์ฐ์์ ์ธ ํ๋ฆ ์ผ๋ก์, ์ด์ ๋ํด ์ผ๋ จ์ ์ค๊ฐ ์ฐ์ฐ๊ณผ ์ต์ข ์ฐ์ฐ์ ์ ์ฉํ์ฌ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ๊ฒ์ ๊ฐ๋ฅ์ผ ํจ. ์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ ํต์ ์ธ ๋ฐ๋ณต๋ฌธ์ ๋นํด ๊ฐ๊ฒฐํ๊ณ ์๋์ ์ง์ค๋ ์ฝ๋ ๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ๋ด๋ถ ๋ฐ๋ณต์ ํตํด ์ต์ ํ ์ฌ์ง๋ฅผ ๋จ๊ฒจ๋๊ฑฐ๋ ์์ฝ๊ฒ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ก ์ ํํ ์ ์๋ค๋ ์ฅ์ ์ด ์์.
์คํธ๋ฆผ API ์ ๋์ ๋ฐฐ๊ฒฝ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๊ฐ ์์.
์ฒซ์งธ, ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ํ์์ฑ ์. ๋ฉํฐ์ฝ์ด ์๋์ ํจ๊ณผ์ ์ผ๋ก ์ปฌ๋ ์
์ ์ฒ๋ฆฌํ๋ ค๋ฉด, ๊ฐ๋ฐ์๊ฐ ์ผ์ผ์ด ์ฐ๋ ๋๋ฅผ ๊ด๋ฆฌํ์ง ์๊ณ ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋ณ๋ ฌํํ ์ ์๋ ๊ณ ์์ค์ ์ถ์ํ๊ฐ ์๊ตฌ๋์์. ์คํธ๋ฆผ์ parallelStream() ๋ฉ์๋๋ฅผ ํตํด ๊ฐ๋จํ ๋ฐ์ดํฐ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ ์ ์๊ฒ ํด์ค.
๋์งธ, ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ ๊ฐ์ ์. ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ฉด ๋ฃจํ์ ์กฐ๊ฑด๋ฌธ์ด ๋ค์์ธ ์ฝ๋๋ณด๋ค ์๋๊ฐ ๋ช ํํ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ ์ ์๊ณ , ์ด๋ฅผ ํตํด ๋น์ฆ๋์ค ๋ก์ง์ ์ผ๊ด๋ ํํ๋ก ํํ ํ ์ ์์.
๋ง์ง๋ง์ผ๋ก, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋
์ ๋์
ํจ์ผ๋ก์จ ๋ถ์์ฉ ์๋ ์ฒ๋ฆฌ ๋ฅผ ์งํฅํ๊ณ , ํํฐ๋ง, ๋งคํ, ์ ๋ ฌ, ๊ทธ๋ฃนํ ๋ฑ ๊ณตํต ์ฐ์ฐ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํ์คํ ํ๊ณ ์ ํ ์๋๊ฐ ์์. ์๋ฅผ ๋ค์ด ๊ณผ๊ฑฐ์๋ ๋ฐ๋ณต๋ฌธ๊ณผ ์กฐ๊ฑด๊ฒ์ฌ๋ฅผ ํตํด ์ง์ ๊ตฌํํด์ผ ํ๋ ๋ก์ง๋ค์ ์ด์ ๋ filter , map , collect ๋ฑ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฐ์ฐ์ผ๋ก ํ์ค์ฉ ํํํ ์ ์์.
์คํธ๋ฆผ ๊ตฌ์กฐ์ ์ฃผ์ ์ฐ์ฐ
์คํธ๋ฆผ API ์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ ์์ค ๋ก๋ถํฐ ์คํธ๋ฆผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฌ๋ฌ ์ค๊ฐ ์ฐ์ฐ (Intermediate Operation) ์ ์ฐ์์ผ๋ก ์ ์ฉํ ๋ค, ์ต์ข ์ฐ์ฐ (Terminal Operation) ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ์ป๋ ํจํด์ผ๋ก ์์ฝ๋จ. ์ด๋ ์ค๊ฐ ์ฐ์ฐ๋ค์ ์คํธ๋ฆผ์ ๋ฆฌํดํ์ฌ ๋ค์ ์ฐ์ฐ๊ณผ ์ฒด์ด๋๋๋ฉฐ, ์ค์ ์ฒ๋ฆฌ(load) ๋ ์ต์ข ์ฐ์ฐ์ด ํธ์ถ๋ ๋ ๋น๋ก์ ์ผ์ด๋๋ ์ง์ฐ ํ๊ฐ(lazy evaluation) ํน์ฑ์ ๊ฐ์ง. ์คํธ๋ฆผ์ ์ ์ฒด์ ์ธ ๊ตฌ์ฑ์์๋ ๋ค์๊ณผ ๊ฐ์.
๋ฐ์ดํฐ ์์ค(Data Source) : ์คํธ๋ฆผ์ ์ถ๋ฐ์ ์ด ๋๋ ์์๋ค์ ๋ชจ์์. ์๋ฅผ ๋ค์ด ์ปฌ๋ ์ ์
stream()๋ฉ์๋๋ฅผ ํธ์ถํ๊ฑฐ๋, ๋ฐฐ์ด์Arrays.stream(array)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ํ์ผ I/O ์์Files.lines(path)๋ก ์คํธ๋ฆผ์ ์์ฑํ ์ ์์.์ค๊ฐ ์ฐ์ฐ(Intermediate Operation) : ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ฑฐ๋ ๋ณํํ๋ ์ฐ์ฐ๋ค์. ๋ํ์ ์ผ๋ก
filter(Predicate),map(Function),sorted(),distinct(),limit()๋ฑ์ด ์์ผ๋ฉฐ, ์ฌ๋ฌ ์ค๊ฐ ์ฐ์ฐ์ ํ์ดํ๋ผ์ธ ํํ ๋ก ์ฐ๊ฒฐํ ์ ์์. ์ค๊ฐ ์ฐใ ๋์ lazy ํ๊ฒ ๋์ํ์ฌ, ๋จ๋ ์ผ๋ก๋ ์คํ๋์ง ์๊ณ ๊ฒฐ๊ณผ๋ ๋ฐ๋ก ์ป์ ์ ์์. ์ค๊ฐ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ ์ฌ์ ํ ์คํธ๋ฆผ์ด๋ฏ๋ก, ์ด์ด์ ๋ค์ ์ฐ์ฐ์ ์ ์ฉํ ์ ์์.์ต์ข ์ฐ์ฐ(Terminal Operation) : ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ๋์ ๋งบ๋ ์ฐ์ฐ์ผ๋ก, ์ต์ข ์ฐ์ฐ์ด ํธ์ถ๋ ๋ ๊ทธ์ ์์ผ ์ด์ ๊น์ง์ ๋ชจ๋ ์ค๊ฐ ์ฐ์ฐ์ด ์ ์ฉ๋๋ฉด์ ์ค์ ์ฒ๋ฆฌ ๊ฐ ์ํ๋๊ณ ๊ฒฐ๊ณผ๊ฐ ์์ฑ๋จ. ์ต์ข ์ฐ์ฐ์๋ ์คํธ๋ฆผ ์์๋ฅผ ์๋ชจํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ์ป๋
collect(),count(),reduce()๋, ๋ถ์์ฉ์ ๋ฐ์์ํค๋forEach()๋ฑ์ด ์์. ์ต์ข ์ฐ์ฐ์ ํธ์ถํ๋ฉด ํด๋น ์คํธ๋ฆผ์ ์ฌ์ฌ์ฉํ ์ ์๊ฒ(์๋ชจ๋ ์ํ๋ก) ๋จ.
์์
๋ฌธ์์ด ๋ฆฌ์คํธ ์์ ํน์ ์กฐ๊ฑด์ ๋ง๋ ๋ฌธ์์ด๋ง ํํฐ๋งํ์ฌ ๋๋ฌธ์๋ก ๋ณํํ ๋ค ์ ๋ ฌํ์ฌ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ๋ฅผ ์ป๋ ์์ ์, ๊ธฐ์กด ๋ฐฉ์๊ณผ ์คํธ๋ฆผ์ ํ์ฉํ ๋ฐฉ์์ผ๋ก ๋น๊ตํ๋ ์์ ์.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Anna", "Alex");
List<String> resultList = new ArrayList<>();
// ๊ธฐ์กด ๋ฐฉ์: ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ
for(String name : names) {
if(name.startWith("A")) {
resultList.add(name,toUpperCase());
}
}
Collections.sort(resultList); // ์ ๋ ฌ
System.out.println(resultList); // result : [ALEX, ALICE, ANNA]
//์คํธ๋ฆผ ์ฌ์ฉ : ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ
List<String> resultList2 = names.stream()
.filter(n -> n.startWith("A"))
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
System.out.println(resultList2);
์ ์์ ์์ ์ ์ ์๋ฏ์ด, ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ง์น SQL์ ์ง์๋ฌธ ์ฒ๋ผ ์ ์ธ์ ์ผ๋ก ์์ฑํ ์ ์์. names.stream() ์ผ๋ก ๋ฆฌ์คํธ์ ๋ํ ์คํธ๋ฆผ์ ์ป์ ๋ค, filter ๋ก "A" ๋ก ์์ํ๋ ์ด๋ฆ๋ง ๊ฑธ๋ฌ๋ด๊ณ , map ์ผ๋ก ๋๋ฌธ์ ๋ณํ, sorted ๋ก ์ ๋ ฌ, ๋ง์ง๋ง์ collect ๋ก ๋ฆฌ์คํธ๋ก ๋ชจ์ผ๋ ์ผ๋ จ์ ๊ณผ์ ์ ๋ฉ์๋ ์ฒด์ด๋ ์ผ๋ก ํํํ์. ๊ธฐ์กด ๋ฐฉ์๊ณผ ๋น๊ตํ๋ฉด ์ฝ๋์ ํ ์๊ฐ ์ค์ด๋ค๊ณ , ๊ฐ ๋จ๊ณ์ ์๋๊ฐ ์ฝ๋์ ๋ช
ํํ ๋๋ฌ๋๋ ๊ฒ์ ๋ณผ ์ ์์.
๋ํ ์คํธ๋ฆผ์ ์ง์ฐ ์คํ ๋๋ถ์, ๋ง์ฝ ์ ํ์ดํ๋ผ์ธ์์ filter ํ ๋ฐ๋ก ์ฒซ ๋ฒ์งธ ๋งค์นญ ์์๋ง ์ฐพ๋ ์ฐ์ฐ(์: findFirst() ) ์ ์ต์ข
์ฐ์ฐ์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด ์กฐ๊ฑด์ ๋ง๋ ๋๋จธ์ง ์์๋ค์ ๊ตณ์ด ๋๋ฌธ์ ๋ณํ์ด๋ ์ ๋ ฌ์ ์ํํ์ง ์๊ณ ๋ ์ฒ๋ฆฌ๋ฅผ ๋ง์น ์ ์์. ์ด๋ฌํ lazy ํน์ฑ ์ ๋ถํ์ํ ์ฐ์ฐ์ ์ค์ฌ ์ฑ๋ฅ์ ๋์ผ ์ ์๋ ์์์.
๋ง์ง๋ง์ผ๋ก ์คํธ๋ฆผ์๋ ๊ธฐ๋ณธํ ํนํ ์คํธ๋ฆผ (IntStream , LongStream , DoubleStream ) ๋ ์ ๊ณต๋จ. ์ด๋ฅผ ํ์ฉํ๋ฉด ๋ฐ์ฑ(boxing)/์ธ๋ฐ์ฑ ์์ด ๊ธฐ๋ณธ ํ์
์ ๋๋ ๋ฐ์ดํฐ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์. ์๋ฅผ ๋ค์ด, IntStream.range(1,100) ์ 1 ๋ถํฐ 99๊น์ง์ ์ ์ ์คํธ๋ฆผ์ ์์ฑํ๋ฉฐ, mapToObj ๋ mapToInt ๋ฑ์ ๋ฉ์๋๋ฅผ ํตํด ๊ฐ์ฒด ์คํธ๋ฆผ๊ณผ ๊ธฐ๋ณธํ ์คํธ๋ฆผ ๊ฐ ์ ํ๋ ๊ฐ๋ฅํจ.
์คํธ๋ฆผ์ ์ฅ์
์ฝ๋ ์ ์ธ์ฑ & ๊ฐ๊ฒฐํจ : ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ฉด ์๋ฃ ์ฒ๋ฆฌ์ ๋ํ ์๋๋ฅผ ์ฝ๋์ ํํํ๊ธฐ ์ฌ์. ๋ฌด์์ ํ๊ณ ์ ํ๋์ง๋ฅผ ๋ฉ์๋ ํธ์ถ ์ฒด์ธ์ผ๋ก ๋ณด์ฌ์ฃผ๋ฏ๋ก, for-loop ๋ฑ์ ๋นํด ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ๋ ผ๋ฆฌ์ ํ๋ฆ์ด ๋ถ๋ช ํจ . ํนํ ๋ค๋จ๊ณ ์ฒ๋ฆฌ (ํํฐ๋ง -> ๋งคํ -> ์ ๋ ฌ -> ์ง๊ณ ๋ฑ) ๋ฅผ ์ค์ฒฉ ๋ฃจํ ์์ด ํ์ดํ๋ผ์ธ์ผ๋ก ํํํ ์ ์์ด, ๋ณต์กํ ์ฒ๋ฆฌ๋ ๋น๊ต์ ์ฝ๊ธฐ ์ฝ๊ฒ ์์ฑํ ์ ์์.
์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฐ์ฐ :
filter,map,reduce,collect๋ฑ ์คํธ๋ฆผ์ด ์ ๊ณตํ๋ ๋ง์ ์ฐ์ฐ์ ์ด๋ฏธ ์ต์ ํ๋์ด ์๊ณ ๋ฒ์ฉ์ ์ผ๋ก ์ธ ์ ์๋ ๊ณ ์์ค ํจ์๋ค์. ์ด๋ฅผ ํ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ ์์ค์์ ์ผ์ผ์ด ์์ฑํด์ผ ํ๋ ๋ก์ง์ ์ค์ด๊ณ ์์ฐ์ฑ ์ ๋์ผ ์ ์์.๋ถ๋ณ์ฑ๊ณผ ๋ถ์์ฉ ์ต์ํ : ์คํธ๋ฆผ ์ฐ์ฐ์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ก์ด ๊ฒฐ๊ณผ๋ฅผ ์์ฑํจ. ๋ํ ์ค๊ฐ ์ฐ์ฐ๋ค์ ์์ ํจ์ํ์ผ๋ก ๋์ํ๋๋ก ๊ถ์ฅ๋๋ฏ๋ก(์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ๋๋ค), ํ๋ก๊ทธ๋จ์ ๋ถ์์ฉ(side effect) ์ ์ค์ด๊ณ ๋ฒ๊ทธ๋ฅผ ์๋ฐฉํ๋ ๋ฐ ๋์์ด ๋จ. ์ด๋ฐ ํน์ฑ์ ์ฝ๋์ ํ ์คํธ ์ฉ์ด์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ๋ ํฅ์์ํด.
Lazy ์ฐ์ฐ์ผ๋ก ์ธํ ์ต์ ํ : ์์ ์ค๋ช ํ ๋๋ก, ์คํธ๋ฆผ์ ์ง์ฐ ํ๊ฐ๋ฅผ ํตํด ํ์ํ ๋๋ง ์ฐ์ฐ์ ์คํํ๋ฏ๋ก ์ฑ๋ฅ ์ต์ ํ ์ ๋์์ด ๋จ. ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ๋จ๊ณ์ ์ค๊ฐ ์ฐ์ฐ์ด ์๋๋ผ๋, ์ต์ข ์ฐใ ๋์ด
findFirst๋anyMatch์ฒ๋ผ ์ผ๋ถ๋ง ํ์๋ก ํ๋ ์์ ์ด๋ฉด ์ ์ฒด ์์๋ฅผ ๋๊น์ง ์ฒ๋ฆฌํ์ง ์์. ๋ํ ํ์ดํ๋ผ์ธ ๋ด๋ถ์์ ์ฐ์ฐ๋ค์ด ๋ฃจํ ํจ์ (loop fusion) ๋์ด ํ ๋ฒ์ ์ํ๋ก ์ฒ๋ฆฌ๋ ์๋ ์์.๋ณ๋ ฌ ์ฒ๋ฆฌ ์ฉ์ด : ์คํธ๋ฆผ์ ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋๋ ์์ฌ์ด ๋ณ๋ ฌํ์.
stream()๋์parallelStream()์ ํธ์ถํ๋ฉด ๋ด๋ถ์ ์ผ๋ก Fork/Join ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ ์ฝ์ด์ ์์ ์ ๋ถ๋ฐฐํจ. ํฐ ์ปฌ๋ ์ ์ ๋ํด CPU ์ฝ์ด๋ฅผ ๋ชจ๋ ํ์ฉํจ์ผ๋ก์จ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋ณต์กํ ๋ฉํฐ์ค๋ ๋ ์ฝ๋๋ฅผ ์ง์ ์์ฑํ ํ์๊ฐ ์์.๋ค์ํ ๋ฐ์ดํฐ ์์ค ์ฒ๋ฆฌ : ์ปฌ๋ ์ ๋ฟ๋ง ์๋๋ผ ๋ฐฐ์ด, ํ์ผ , I/O ์ฑ๋ ๋ฑ ๋ค์ํ ์์ค๋ก๋ถํฐ ์คํธ๋ฆผ์ ์์ฑํ์ฌ ๊ณตํต๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์. ์๋ฅผ ๋ค์ด
Files.lines()๋ก ํ์ผ์ ๊ฐ ์ค์ ์คํธ๋ฆผ์ผ๋ก ์ป์ด ์ฒ๋ฆฌํ๊ฑฐ๋,Pattern.compile(...).splitAsStream()์ผ๋ก ๋ฌธ์์ด์ ์คํธ๋ฆผ์ผ๋ก ๋ค๋ฃจ๋ ๋ฑ ์์ฉ ๋ฒ์๊ฐ ๋์.
์คํธ๋ฆผ์ ๋จ์
์๋ ๋ฐ์ดํฐ์ ๋ํ ์ค๋ฒํค๋ : ์คํธ๋ฆผ์ ์์ฑํ๊ณ ๋๋ค๋ฅผ ํธ์ถํ๋ฉฐ ์ฌ๋ฌ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋น์ฉ ๋๋ฌธ์, ์์ฃผ ๋จ์ํ ๋ฐ๋ณต์ด๋ ์๋์ ๋ฐ์ํฐ ์ฒ๋ฆฌ์๋ ์คํ๋ ค ์ ํต์ ์ธ ๋ฃจํ๋ณด๋ค ๋๋ฆด ์ ์์ . ์์ปจ๋ฐ ๋จ์ํ ๋ฆฌ์คํธ์ ๋ด์ฉ์ ์ถ๋ ฅํ๋ ๊ฒฝ์ฐ์๋
names.stream().forEach(...)๋ณด๋ค๋ ๊ฐํ๋ for๋ฌธ(for(String name : names)) ์ด ์ฑ๋ฅ์ ์ ๋ฆฌํ ์ ์์. ์์ ์์ ์ ์ผ๊ด์ ์ผ๋ก ์คํธ๋ฆผ์ ์ ์ฉํ๋ ๊ฒ์ ํผํ๋ ๊ฒ์ด ์ข์.๋๋ฒ๊น ๋ฐ ์ถ์ ์ด๋ ค์ : ๋๋ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์ฝ๋์ ํ๋ฆ์ด ์ฐ์์ ์ผ๋ก ์ด์ด์ง๋ฏ๋ก, ์ค๊ฐ ๋จ๊ณ์์ ๊ฐ์ ๋์ผ๋ก ํ์ธํ๊ฑฐ๋ ๋๋ฒ๊น ํ๋ ๊ฒ์ด ์ด๋ ค์. ๋๋ฒ๊ฑฐ๋ก๋ ๋๋ค ๋ด๋ถ๋ฅผ ์ผ์ผ์ด ๋ค์ฌ๋ค ๋ด์ผ ํ๊ณ , ์ฝ๋์์ผ๋ก๋
peek()๊ฐ์ ๋๋ฒ๊น ์ฉ ์ฐ์ฐ์ ์ถ๊ฐํด์ผ ์ค๊ฐ๊ฐ์ ๋ณผ ์ ์์. ๋ณต์กํ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์ ์ง๋ณด์ ์์ ์ดํดํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์.์ฌ์ฌ์ฉ ๋ถ๊ฐ ๋ฐ ํ๊ณ : ์ผ๋จ ์ต์ข ์ฐ์ฐ์ ํตํด ํ ๋ฒ ์๋น๋ ์คํธ๋ฆผ์ ๋ค์ ์ฌ์ฉํ ์ ์์. ํ์ํ ๊ฒฝ์ฐ ์๋ก์ด ์คํธ๋ฆผ์ ๋ง๋ค์ด์ผ ํ๋ฏ๋ก, ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฒ ์ํํด์ผ ํ๋ค๋ฉด ์ฐจ๋ผ๋ฆฌ ์ฒ์๋ถํฐ ๊ทธ ์ฒ๋ฆฌ๋ฅผ ํตํฉํ๊ฑฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ปฌ๋ ์ ์ ๋ชจ์ ํ ์ฌ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํด์ผ ํจ. ๋ํ ์คํธ๋ฆผ์ ๋ณธ์ง์ ์ผ๋ก ์์ฐจ์ ์ธ ์ฒ๋ฆฌ ์ถ์ํ ์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์, ํน์ ์ผ์ด์ค (์ : ์์๋ฅผ ํ๋ ์ฒ๋ฆฌํ๋ค๊ฐ ์ธ๋ถ ์ ๊ฑด์ ๋ฐ๋ผ ๋ฃจํ๋ฅผ ์ ์ฒด๋ฅผ ์ค๋จํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ฑ) ์์๋ ์คํธ๋ฆผ๋ง์ผ๋ก ๊ตฌํ์ด ๊น๋ค๋กญ๊ฑฐ๋ ๋ถ์ ํฉ ํ ์ ์์.
๋ณ๋ ฌ ์คํธ๋ฆผ ์ฃผ์์ฌํญ : ๋ณ๋ ฌ ์คํธ๋ฆผ์ ์ฌ์ฉํ ๋๋ ๊ณต์ ์ํ ๋ณ๊ฒฝ์ด๋ ์ค๋ ๋ ์์ ์ฑ ์ ์ ์ํด์ผํจ. ์๋ชปํ๋ฉด ๊ฒฝ์ ์กฐ๊ฑด (race condition) ์ด ๋ฐ์ํ๊ฑฐ๋, ๊ธฐ๋ํ์ง ์์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์. ๋ํ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์์ฒด์ ์ค๋ฒํค๋ ๋๋ฌธ์, ๋ฐ์ดํฐ๋์ด ์ถฉ๋ถํ ํฌ์ง ์์ผ๋ฉด ๋ณ๋ ฌํ๊ฐ ์ญํ๋ฅผ ๋ผ ์ ์์.
๋ฉ๋ชจ๋ฆฌ ์๋น : ์คํธ๋ฆผ์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์๋ก ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ด๋ ํจํด์ด๋ฏ๋ก, ํํฐ๋ง์ด๋ ๋งคํ ๊ฒฐ๊ณผ๋ฅผ ์๋ก์ด ์ปฌ๋ ์ ์ผ๋ก ์์งํ๋ฉด ๊ทธ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํจ. ์ผ๋ฐ์ ์ธ ๋ฃจํ์์ ์ ์๋ฆฌ์์ ์์ (in-place) ํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, ํ์์ ๋ฐ๋ผ ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ผ์ด๋ ์ ์์. ํนํ ๋ฌดํ ์คํธ๋ฆผ ๋๋ ๋งค์ฐ ํฐ ์คํธ๋ฆผ์ ์๋ชป ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ ์ฃผ์ํด์ผํจ.
Last updated
Was this helpful?