๐ JAVA

์ง์ญ๋ณ์์ ๋ฒ์๋ฅผ ์ต์ํํ๋ผ - [8์ฅ. ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์์น(์์ดํ 57)]
์ง์ญ๋ณ์์ ์ ํจ ๋ฒ์๋ฅผ ์ต์๋ก ์ค์ด๋ฉด ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์์ง๊ณ ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ ๋ฎ์์ง๋ค. ์ด๋ฒ ๊ธ์ ํตํด ์ง์ญ๋ณ์์ ๋ฒ์๋ฅผ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์. ๐ 1. ์ง์ญ๋ณ์๋ฅผ ๊ฐ์ฅ ์ฒ์ ์ฐ์ผ ๋ ์ ์ธํ๋ผ. ์ง์ญ๋ณ์์ ๋ฒ์๋ฅผ ์ค์ด๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฒ์ ์ง์ญ๋ณ์๋ฅผ ๊ฐ์ฅ ์ฒ์ ์ฐ์ผ ๋ ์ ์ธํ๋ ๊ฒ์ด๋ค. ์ ์ธ์ ๋ฏธ๋ฆฌ ํด๋๋ฉด ์ฝ๋๊ฐ ์ด์์ ํด์ ธ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค. ๐ 2. ์ง์ญ๋ณ์๋ ์ ์ธ๊ณผ ๋์์ ์ด๊ธฐํํ๋ผ. ์ด๊ธฐํ์ ํ์ํ ์ ๋ณด๊ฐ ์ถฉ๋ถํ์ง ์๋ค๋ฉด ์ถฉ๋ถํด์ง ๋๊น์ง ์ ์ธ์ ๋ฏธ๋ค์ผ ํ๋ค. try-catch ๋ฌธ์ ๊ฒฝ์ฐ ๋ณ์ ๊ฐ์ try ๋ธ๋ก ๋ฐ๊นฅ์์๋ ์ฌ์ฉํด์ผ ํ ์๋ ์์ผ๋ฏ๋ก ์์ธ๋ค. ๐ 3. ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ผ. ๋ฐ๋ณต๋ฌธ์ ๋ ํนํ ๋ฐฉ์์ผ๋ก ๋ณ์ ๋ฒ์๋ฅผ ์ต์ํํด์ค๋ค. ๋ฐ๋ณต ๋ณ์์ ๊ฐ์ ๋ฐ๋ณต๋ฌธ์ด ์ข ๋ฃ๋ ๋ค์๋ ์จ์ผ ํ..

๊ณต๊ฐ๋ API์์์๋ ํญ์ ๋ฌธ์ํ ์ฃผ์์ ์์ฑํ๋ผ - [8์ฅ. ๋ฉ์๋(์์ดํ 56)]
๐ 1. ๋ฌธ์ํ ์ฃผ์ ์์ฑ ๋ฐฉ๋ฒ ์๋ฐ์๋ ์์ค์ฝ๋ ํ์ผ์์ ๋ฌธ์ํ ์ฃผ์(doc comment; ์๋ฐ๋ ์ฃผ์)์ด๋ผ๋ ํน์ํ ํํ๋ก ๊ธฐ์ ๋ ์ค๋ช ์ ์ถ๋ ค API ๋ฌธ์๋ก ๋ณํํ์ฌ ๋ณด์ฌ์ฃผ๋ ์๋ฐ๋ ์ด ์๋ค. ๋ฌธ์ํ ์ฃผ์์ ์์ฑํ๋ ๊ท์น์ '๋ฌธ์ํ ์ฃผ์ ์์ฑ๋ฒ(How to Write Doc Comments)'์ ๊ธฐ์ ๋์ด ์๋ค. ํด๋น ๋ฌธ์์ ๋ํด์ ์ถ๊ฐ์ ์ผ๋ก ์์์ผ ํ๋ ๋ด์ฉ์ ์๋์ ๊ฐ๋ค. API๋ฅผ ์ฌ๋ฐ๋ก ๋ฌธ์ํํ๋ ค๋ฉด ๊ณต๊ฐ๋ ๋ชจ๋ ํด๋์ค, ์ธํฐํ์ด์ค, ๋ฉ์๋, ํ๋ ์ ์ธ์ ๋ฌธ์ํ ์ฃผ์์ ๋ฌ์์ผ ํ๋ค. ์ง๋ ฌํํ ์ ์๋ ํด๋์ค๋ผ๋ฉด ์ง๋ ฌํ ํํ์ ๊ดํด์๋ ์ ์ด์ผ ํ๋ค. ๊ธฐ๋ณธ ์์ฑ์์๋ ๋ฌธ์ํ ์ฃผ์์ ๋ฌ ๋ฐฉ๋ฒ์ด ์์ผ๋ ๊ณต๊ฐ ํด๋์ค๋ ์ ๋ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋๋ค. ์ ์ง๋ณด์๊น์ง ๊ณ ๋ คํ๋ค๋ฉด ๋๋ค์์ ๊ณต๊ฐ๋์ง ์์ ํด๋..

์ต์ ๋ ๋ฐํ์ ์ ์คํ ํ๋ผ - [8์ฅ. ๋ฉ์๋(์์ดํ 55)]
๐ 1. ์ต์ ๋ ๊ฐ๋ Optional๋ null์ด ์๋ T ํ์ ์ฐธ์กฐ๋ฅผ ํ๋ ๋ด๊ฑฐ๋, ํน์ ์๋ฌด๊ฒ๋ ๋ด์ง ์์ ์ ์๋ค. ๋ณดํต์ T๋ฅผ ๋ฐํํด์ผ ํ์ง๋ง ํน์ ์กฐ๊ฑด์์๋ ์๋ฌด๊ฒ๋ ๋ฐํํ์ง ์์์ผ ํ ๋ T ๋์ Optional๋ฅผ ๋ฐํํ๋๋ก ์ ์ธํ๋ฉด ๋๋ค. ์ต์ ๋์ ๋ฐํํ๋ ๋ฉ์๋๋ ์์ธ๋ฅผ ๋์ง๋ ๋ฉ์๋๋ณด๋ค ์ ์ฐํ๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ฐ๋ฉฐ, null์ ๋ฐํํ๋ ๋ฉ์๋๋ณด๋ค ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ด ์๋ค. ์ปฌ๋ ์ ์ ์ต๋๊ฐ์ ๊ตฌํ๋ ๋ฉ์๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด Optional๋ก ํํํ ์ ์๋ค. // Optional์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ public static E max(Collection c) { if(c.isEmpty()) throw new IllegalArgumentException("๋น ์ปฌ๋ ์ "); E result = null; ..

null์ด ์๋, ๋น ์ปฌ๋ ์ ์ด๋ ๋ฐฐ์ด์ ๋ฐํํ๋ผ - [8์ฅ. ๋ฉ์๋(์์ดํ 54)]
๐ 1. null์ ๋ฐํํ๋ ๊ฒฝ์ฐ ๋งค์ฅ ์์ ์น์ฆ ๋ชฉ๋ก์ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ์ดํด๋ณด์. private final List cheeseInStock = ...; /** * @return ๋งค์ฅ ์์ ๋ชจ๋ ์น์ฆ ๋ชฉ๋ก์ ๋ฐํํ๋ค. * ๋จ, ์ฌ๊ณ ๊ฐ ํ๋๋ ์๋ค๋ฉด null์ ๋ฐํํ๋ค. */ public List getCheeses() { return cheeseInStock.isEmpty() ? null : new ArrayList(cheeseInStock); } ์ปฌ๋ ์ ์ด๋ ๋ฐฐ์ด ๊ฐ์ ์ปจํ ์ด๋(container)๊ฐ ๋น์์ ๋ null์ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋๋ฉด ํญ์ ์๋์ ๊ฐ์ ๋ฐฉ์ด ์ฝ๋๋ฅผ ๋ฃ์ด์ค์ผ ํ๋ค. List cheeses = shop.getCheese(); if(cheeses != null && chee..

๊ฐ๋ณ์ธ์๋ ์ ์คํ ์ฌ์ฉํ๋ผ - [8์ฅ. ๋ฉ์๋(์์ดํ 53)]
๐ 1. ๊ฐ๋ณ์ธ์ ์ธ์ ๊ฐ์๊ฐ ์ผ์ ํ์ง ์์ ๋ฉ์๋๋ฅผ ์ ์ํ ๋ ๊ฐ๋ณ์ธ์(varargs)๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด, ๊ฐ์ฅ ๋จผ์ ์ธ์์ ๊ฐ์์ ๊ธธ์ด๊ฐ ๊ฐ์ ๋ฐฐ์ด์ ๋ง๋ค๊ณ ์ธ์๋ค์ ์ด ๋ฐฐ์ด์ ์ ์ฅํ์ฌ ๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ฅผ ๊ฑด๋ค์ค๋ค. ์ ๋ ฅ๋ฐ์ int ์ธ์๋ค์ ํฉ์ ๊ณ์ฐํด ์ฃผ๋ ๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค ์ ์๋ค. static int sum(int... args) { int sum = 0; for (int arg : args) sum += arg; return sum; } ๐ 2. ๊ฐ๋ณ์ธ์์ ๋ฌธ์ ์ ๊ณผ ๊ทธ์ ๋ฐ๋ฅธ ํด๊ฒฐ์ฑ ๊ฐ๋ณ์ธ์๋ฅผ ์๋์ ๊ฐ์ด ์๋ชป ๊ตฌํํ ์๋ ์๋ค. static int min(int... args) { if(args.length == 0) throw new Illega..

๋ค์ค์ ์๋ ์ ์คํ ์ฌ์ฉํ๋ผ - [8์ฅ. ๋ฉ์๋(์์ดํ 52)]
๐ 1. ๋ค์ค์ ์์ ๋ฌธ์ ์ปฌ๋ ์ ์ '์งํฉ, ๋ฆฌ์คํธ, ๊ทธ ์ธ'๋ก ๊ตฌ๋ถํ๋ ํ๋ก๊ทธ๋จ์ด ์๋ค๊ณ ํ์. public class CollectionClassifier { public static String classify(Set s) { return "์งํฉ"; } public static String classify(List s) { return "์งํฉ"; } public static String classify(Collection s) { return "์งํฉ"; } public static void main(String[] args) { Collection [] collections = { new HashSet(), new ArrayList(), new HashMap().values() }; for (Coll..

๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ์ ์คํ ์ค๊ณํ๋ผ - [8์ฅ. ๋ฉ์๋(์์ดํ 51)]
์ด๋ฒ ๊ธ์ ํตํด API ์ค๊ณ ์๋ น๋ค์ ์ดํด๋ณด์. ์ด๋ฅผ ํ์ฉํ๋ฉด ๋ฐฐ์ฐ๊ธฐ ์ฝ๊ณ , ์ฐ๊ธฐ ์ฌ์ฐ๋ฉฐ, ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ด ์ ์ API๋ฅผ ๋ง๋ค ์ ์์ ๊ฒ์ด๋ค. ๐ 1. ๋ฉ์๋ ์ด๋ฆ์ ์ ์คํ ์ง์. ๋ฉ์๋ ์ด๋ฆ์ ์ ์คํ ์ง๋ ๊ฒ์ ๋ํด์๋ ๋๋ฌด๋ ๋ง์ด ๋ค์ด๋ดค์ ๊ฒ์ด๋ค. ์๊ณ ์๋ ๊ฒ์ ํ๋ฒ ๋ ์๊ธฐ์ํจ๋ค๋ ์๊ฐ์ผ๋ก ๋ณด๊ณ ๋์ด๊ฐ์. ํญ์ ํ์ค ๋ช ๋ช ๊ท์น์ ๋ฐ๋ผ์ผ ํ๋ค. ์ดํดํ ์ ์๊ณ , ๊ฐ์ ํจํค์ง์ ์ํ ๋ค๋ฅธ ์ด๋ฆ๋ค๊ณผ ์ผ๊ด๋๊ฒ ์ง์. ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ ๋๋ฆฌ ๋ฐ์๋ค์ฌ์ง๋ ์ด๋ฆ์ ์ฌ์ฉํ์. ๊ธด ์ด๋ฆ์ ํผํ์. ์ ๋งคํ๋ฉด ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ API ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์. ๐ 2. ํธ์ ๋ฉ์๋๋ฅผ ๋๋ฌด ๋ง์ด ๋ง๋ค์ง ๋ง์. ๋ฉ์๋๊ฐ ๋๋ฌด ๋ง์ ํด๋์ค๋ ์ตํ๊ณ , ์ฌ์ฉํ๊ณ , ๋ฌธ์ํํ๊ณ , ํ ์คํธํ๊ณ , ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ต๋ค. ์ธํฐํ์ด์ค๋ ๋ง์ฐฌ๊ฐ์ง..

์ ์์ ๋ฐฉ์ด์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๋ผ - [8์ฅ. ๋ฉ์๋(์์ดํ 50)]
์๋ฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์์ ํ ์ธ์ด๋ค. ํ์ง๋ง ์๋ฌด๋ฆฌ ์๋ฐ๋ผ ํด๋ ๋ค๋ฅธ ํด๋์ค๋ก๋ถํฐ์ ์นจ๋ฒ์ ์๋ฌด๋ฐ ๋ ธ๋ ฅ ์์ด ๋ค ๋ง์ ์ ์๋ ๊ฒ์ ์๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๋ฆฌ์ ๋ถ๋ณ์์ ๊นจ๋จ๋ฆฌ๋ ค ํ์์ด ๋์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ฐฉ์ด์ ์ผ๋ก ํ๋ก๊ทธ๋๋ฐํด์ผ ํ๋ค. ๐ 1. ์ฒซ ๋ฒ์งธ ๊ณต๊ฒฉ - ์์ฑ์ ์ด์ฉ '์์ ์๊ฐ์ด ์ข ๋ฃ ์๊ฐ๋ณด๋ค ๋ฆ์ ์ ์๋ค๋ ๋ถ๋ณ์'์ด ์๋ ๋ค์๊ณผ ๊ฐ์ ํด๋์ค๊ฐ ์๋ค๊ณ ํ์. public final class Period { private final Date start; private final Date end; /** * @param start ์์ ์๊ฐ * @param end ์ข ๋ฃ ์๊ฐ; ์์ ์๊ฐ๋ณด๋ค ๋ค์ฌ์ผ ํ๋. * @throws IllegalArgumentException ์์ ์๊ฐ์ด ์ข ..

๋งค๊ฐ๋ณ์๊ฐ ์ ํจํ์ง ๊ฒ์ฌํ๋ผ - [8์ฅ. ๋ฉ์๋(์์ดํ 49)]
๋ฉ์๋๋ ์์ฑ์๋ฅผ ์์ฑํ ๋๋ฉด ๊ทธ ๋งค๊ฐ๋ณ์๋ค์ ์ด๋ค ์ ์ฝ์ด ์์์ง ์๊ฐํด์ผ ํ๋ค. ์ด๋ฅผ ์ํ ์์น 2๊ฐ์ง๋ฅผ ์ดํด๋ณด์. ๐ 1. ์์น 1 : ์ค๋ฅ๋ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ (๋ฐ์ํ ๊ณณ์์) ์ก์์ผ ํ๋ค. ์ค๋ฅ๋ฅผ ๋ฐ์ํ ์ฆ์ ์ก์ง ๋ชปํ๋ฉด ํด๋น ์ค๋ฅ๋ฅผ ๊ฐ์งํ๊ธฐ ์ด๋ ค์์ง๊ณ , ๊ฐ์งํ๋๋ผ๋ ์ค๋ฅ์ ๋ฐ์ ์ง์ ์ ์ฐพ๊ธฐ ์ด๋ ค์์ง๋ค. ๋งค๊ฐ๋ณ์ ๊ฒ์ฌ๋ฅผ ์ ๋๋ก ํ์ง ๋ชปํ๋ฉด ์๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฉ์๋๊ฐ ์ํ๋๋ ์ค๊ฐ์ ๋ชจํธํ ์์ธ๋ฅผ ๋์ง๋ฉฐ ์คํจํ ์ ์๋ค. ๋ฉ์๋๊ฐ ์ ์ํ๋์ง๋ง ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์๋ค. ๋ฉ์๋๋ ๋ฌธ์ ์์ด ์ํ๋์ง๋ง, ์ด๋ค ๊ฐ์ฒด๋ฅผ ์ด์ํ ์ํ๋ก ๋ง๋ค์ด๋์์ ๋ฏธ๋์ ์ ์ ์๋ ์์ ์ ์ด ๋ฉ์๋์๋ ๊ด๋ จ ์๋ ์ค๋ฅ๋ฅผ ๋ง๋ค ์ ์๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ๊ณ ์ public๊ณผ protected ๋ฉ์๋..

์คํธ๋ฆผ ๋ณ๋ ฌํ๋ ์ฃผ์ํด์ ์ ์ฉํ๋ผ - [7์ฅ. ๋๋ค์ ์คํธ๋ฆผ(์์ดํ 48)]
๐ 1. ์๋ฐ์ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ์๋ฐ๋ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ์ธก๋ฉด์์ ํญ์ ์์๊ฐ๋ค. ์ฒ์ ๋ฆด๋ฆฌ์ค๋ 1996๋ ์ค๋ ๋, ๋๊ธฐํ, wait/notify ์ง์ ์๋ฐ 5 ๋์์ฑ ์ปฌ๋ ์ ์ธ java.util.concurrent ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์คํ์(Executor) ํ๋ ์์ํฌ ์ง์ ์๋ฐ 7 ๊ณ ์ฑ๋ฅ ๋ณ๋ ฌ ๋ถํด(parallel decom-position) ํ๋ ์์ํฌ์ธ ํฌํฌ-์กฐ์ธ(fork-join) ํจํค์ง ์ถ๊ฐ ์๋ฐ 8 parallel ๋ฉ์๋๋ง ํ ๋ฒ ํธ์ถํ๋ฉด ํ์ดํ๋ผ์ธ์ ๋ณ๋ ฌ ์คํํ ์ ์๋ ์คํธ๋ฆผ ์ง์ ์ด์ฒ๋ผ ์๋ฐ๋ก ๋์์ฑ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ธฐ๊ฐ ์ ์ ์ฌ์์ง๊ณ ์๋ค. ํ์ง๋ง, ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋๋ ์์ ์ฑ(safety)๊ณผ ์๋ต ๊ฐ๋ฅ(liveness) ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ ์จ์ผ ํ๋ค. ๋ณ๋ ฌ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ ํ๋ก๊ทธ..

๋ฐํ ํ์ ์ผ๋ก๋ ์คํธ๋ฆผ๋ณด๋ค ์ปฌ๋ ์ ์ด ๋ซ๋ค - [7์ฅ. ๋๋ค์ ์คํธ๋ฆผ(์์ดํ 47)]
๐ 1. ์์ ์ํ์ค ๋ฐํ ํ์ ๋น๊ต ์ผ๋ จ์ ์์(์์ ์ํ์ค)๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ ์์์ด ๋ง๋ค. ์ด๋ฐ ๋ฉ์๋์ ๋ฐํ ํ์ ์ผ๋ก Collection, Set, List์ ๊ฐ์ ์ธํฐํ์ด์ค, Iterable, ๋ฐฐ์ด, ์คํธ๋ฆผ์ด ์กด์ฌํ๋ค. ์ด ์ค ๊ฐ์ฅ ์ ํฉํ ํ์ ์ ์ปฌ๋ ์ ์ธํฐํ์ด์ค๋ค. ๋ง์ฝ, API๋ฅผ ์คํธ๋ฆผ๋ง ๋ฐํํ๋๋ก ์ง๋์ผ๋ฉด ๋ฐํ๋ ์คํธ๋ฆผ์ for-each๋ก ๋ฐ๋ณตํ๊ธธ ์ํ๋ ์ฌ์ฉ์๋ ๋น์ฐํ ๋ถ๋ง์ ํ ๋กํ ๊ฒ์ด๋ค. ์คํธ๋ฆผ์ ๋ฐ๋ณตํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ํํด์ผ ํ๋ค. for (ProcessHandle ph : (Iterable) ProcessHandle.allProcesses()::iterator) { ... } ์๋์ ํ์ง๋ง ์ค์ ์ ์ฐ๊ธฐ์๋ ๋๋ฌด ๋์กํ๊ณ ์ง๊ด์ฑ์ด ๋จ์ด์ง๋ค. ๊ทธ๋์ ์๋์ ๊ฐ์ด..

์คํธ๋ฆผ์์๋ ๋ถ์์ฉ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ผ - [7์ฅ. ๋๋ค์ ์คํธ๋ฆผ(์์ดํ 46)]
๐ 1. ์คํธ๋ฆผ์ ํต์ฌ ์คํธ๋ฆผ์ ๊ทธ์ ๋ ํ๋์ API๊ฐ ์๋, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ์ดํ ํจ๋ฌ๋ค์์ด๋ค. ์คํธ๋ฆผ ํจ๋ฌ๋ค์์ ํต์ฌ์ ๊ณ์ฐ์ ์ผ๋ จ์ ๋ณํ(transformation)์ผ๋ก ์ฌ๊ตฌ์ฑํ๋ ๋ถ๋ถ์ด๋ค. ์ด๋ ๊ฐ ๋ณํ ๋จ๊ณ๋ ๊ฐ๋ฅํ ํ ์ด์ ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ์์ ํจ์์ฌ์ผ ํ๋ค. ์์ ํจ์๋ ์ค์ง ์ ๋ ฅ๋ง์ด ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ํจ์๋ค. ๋ค๋ฅธ ๊ฐ๋ณ ์ํ๋ฅผ ์ฐธ์กฐํ์ง ์๊ณ , ํจ์ ์ค์ค๋ก๋ ๋ค๋ฅธ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์์์ผ ํ๋ค. ์ด๋ฅผ ์ํด์๋ (์ค๊ฐ ๋จ๊ณ๋ ์ข ๋จ ๋จ๊ณ๋ ) ์คํธ๋ฆผ ์ฐ์ฐ์ ๊ฑด๋ค๋ ํจ์ ๊ฐ์ฒด๋ ๋ชจ๋ ๋ถ์์ฉ(side effect)์ด ์์ด์ผ ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ง์ฝ ๋ถ์์ฉ(side effect)์ด ๋ฐ์ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์๋์ ๊ฐ์ ๋ฌธ์ ์ ์ด ๋ฐ์ํ๊ฒ ๋๋ค. ๊ฐ๋ ์ฑ Stream์ ์ฌ์ฉํ ์๊ฐ ๋ฐ์ดํฐ์ ๋ณ..