42 ~ 48
์์ดํ
42. ์ต๋ช
ํด๋์ค๋ณด๋ค๋ ๋๋ค๋ฅผ ์ฌ์ฉํ๋ผ
ํต์ฌ ์ ๋ฆฌ
ยท ์๋ฐ 8๋ถํฐ ์์ ๊ฐ์ฒด๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ ํฉํ ๋๋ค๊ฐ ๋์ ๋์๋ค.
ยท ์ต๋ช ํด๋์ค๋ ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ์๋ ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋๋ง ์ฌ์ฉํ์.
ยท ๋๋ค๋ ์์ ํจ์ ๊ฐ์ฒด๋ฅผ ์์ฃผ ์ฝ๊ฒ ํํํ ์ ์์ด (์ด์ ์๋ฐ์์๋ ์ค์ฉ์ ์ด์ง ์๋) ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์งํ์ ์ด์๋ค.
์๋ฐ 8 ์ด์ ์ ํจ์
ยท ์์ ์๋ ์๋ฐ์์ ํจ์ ํ์ ์ ํํํ ๋ ์ถ์ ๋ฉ์๋๋ฅผ ํ๋๋ง ๋ด์ ์ธํฐํ์ด์ค(๋๋ฌผ๊ฒ๋ ์ถ์ ํด๋์ค)๋ฅผ ์ฌ์ฉํ๋ค.
- ์ด๋ฐ ์ธํฐํ์ด์ค์ ์ธ์คํด์ค๋ฅผ ํจ์ ๊ฐ์ฒด๋ผ๊ณ ํ์ฌ, ํน์ ํจ์๋ ๋์์ ๋ํ๋ด๋ ๋ฐ ์ผ๋ค.
ยท JDK 1.1 ๋ถํฐ ํจ์ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์ฃผ์ ์๋จ์ ์ต๋ช ํด๋์ค(์์ดํ 24)๊ฐ ๋์๋ค.
๋ค์ ์ฝ๋๋ ๋ฌธ์์ด์ ๊ธธ์ด์์ผ๋ก ์ ๋ ฌํ๊ธฐ ์ํ ๋น๊ต ํจ์๋ก ์ต๋ช ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
์ ๋ต ํจํด[Gamma95]์ฒ๋ผ ํจ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ณผ๊ฑฐ ๊ฐ์ฒด ์งํฅ ๋์์ธ ํจํด์๋ ์ต๋ช ํด๋์ค๋ฉด ์ถฉ๋ถํ๋ค.
- ์ ์ฝ๋์์ Comparator ์ธํฐํ์ด์ค๊ฐ ์ ๋ ฌ์ ๋ด๋นํ๋ ์ถ์ ์ ๋ต์ ๋ปํ๊ณ , ๊ตฌ์ฒด์ ์ธ ์ ๋ต์ ์ต๋ช ํด๋์ค๋ก ๊ตฌํํ๋ค.
์ต๋ช ํด๋์ค์ ๋จ์ : ๋๋ฌด ๊ธธ๊ธฐ ๋๋ฌธ์ ์๋ฐ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ ํฉํ์ง ์์๋ค.
์๋ฐ 8 ์ดํ์ ํจ์
ยท ์๋ฐ 8๋ถํฐ ์ถ์ ๋ฉ์๋ ํ๋์ง๋ฆฌ ์ธํฐํ์ด์ค๊ฐ ํน๋ณํ ์๋ฏธ๋ฅผ ์ธ์ ๋ฐ์ ํจ์ํ ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ๊ฒ ๋์๊ณ , ์ด ์ธํฐํ์ด์ค๋ค์ ์ธ์คํด์ค๋ฅผ ๋๋ค์(๋๋ ๋๋ค)์ ์ฌ์ฉํด ๋ง๋ค ์ ์๊ฒ ๋์๋ค.
ยท ๋๋ค๋ ํจ์๋ ์ต๋ช ํด๋์ค์ ๊ฐ๋ ์ ๋น์ทํ์ง๋ง, ์ฝ๋๋ ํจ์ฌ ๊ฐ๊ฒฐํ๋ค.
- ๋ํ ์์ง๊ตฌ๋ ํ ์ฝ๋๊ฐ ์ฌ๋ผ์ ธ ์ด๋ค ๋์์ ํ๋์ง ๋ ๋ช ํํ๋ค.
๋ค์์ ์ต๋ช ํด๋์ค๋ฅผ ์ฌ์ฉํ ์์ ์ฝ๋๋ฅผ ๋๋ค ๋ฐฉ์์ผ๋ก ๋ฐ๊พผ ๋ชจ์ต์ด๋ค.
ยท ์ ์ฝ๋์์ ๋๋ค, ๋งค๊ฐ๋ณ์, ๋ฐํ๊ฐ์ ํ์ ์ ์ธ๊ธ์ ์๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๋ฌธ๋งฅ์ ์ดํด ํ์ ์ ์ถ๋ก ํด์ค ๊ฒ์ด๋ค.
- ์ค์ ํ์ ์ ๊ฐ๊ฐ (Comprator<String>),String, int๋ค.
- ์ํฉ์ ๋ฐ๋ผ ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ๊ฒฐ์ ํ์ง ๋ชปํ ์๋ ์๋๋ฐ, ๊ทธ๋ด ๋๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ๋ช ์ํด์ผ ํ๋ค.
ยท ์์ดํ 26์ '์ ๋ค๋ฆญ์ ๋ก ํ์ ์ ์ฐ์ง ๋ง๋ผ', ์์ดํ 29์ '์ ๋ค๋ฆญ์ ์ฐ๋ผ', ์์ดํ 30์ '์ ๋ค๋ฆญ ๋ฉ์๋๋ฅผ ์ฐ๋ผ'๊ณ ํ๋ ์กฐ์ธ ๋ค์ ๋๋ค์ ํจ๊ป ์ธ๋๋ ๋ ๋ฐฐ๋ก ์ค์ํ๋ค. ์ปดํ์ผ๋ฌ๊ฐ ํ์ ์ ์ถ๋ก ํ๋ ๋ฐ ํ์ํ ํ์ ์ ๋ณด ๋๋ถ๋ถ์ ์ ๋ค๋ฆญ์์ ์ป๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฐ๋ฆฌ๊ฐ ์ด ์ ๋ณด๋ฅผ ์ ๊ณตํ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๋ ๋๋ค์ ํ์ ์ ์ถ๋กํ ์ ์๊ฒ ๋์ด, ์ฐ๋ฆฌ๊ฐ ์ผ์ผ์ด ๋ช ์ํด์ผํ๋ค(์ฝ๋๊ฐ ๋์ ๋ถํด์ง).
ยท ํ์ ์ ๋ช ์ํด์ผ ์ฝ๋๊ฐ ๋ ๋ช ํํ ๋๋ง ์ ์ธํ๊ณ , ๋๋ค์ ๋ชจ๋ ๋งค๊ฐ๋ณ์ ํ์ ์ ์๋ตํ์.
- ์ปดํ์ผ๋ฌ๊ฐ "ํ์ ์ ์ ์ ์๋ค"๋ ์ค๋ฅ๋ฅผ ๋ผ ๋๋ง ํด๋น ํ์ ์ ๋ช ์ํ๋ค.
๋๋ค ์๋ฆฌ์ ๋น๊ต ์์ฑ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์๋ค(์์ดํ 14, 43).
์๋ฐ 8์ List ์ธํฐํ์ด์ค์ ์ถ๊ฐ๋ sort ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๋์ฑ ์งง์์ง๋ค.
๋๋ค์ ์ฅ์ - ํจ์ ๊ฐ์ฒด์ ์ค์ฉ์ ์ฌ์ฉ
ยท ๋๋ค๋ฅผ ์ธ์ด ์ฐจ์์์ ์ง์ํ๋ฉด์ ๊ธฐ์กด์๋ ์ ํฉํ์ง ์์๋ ๊ณณ์์๋ ํจ์๋ฅผ ์ค์ฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
๋ค์์ ์์ดํ 34์ Operation ์ด๊ฑฐ ํ์ ์ด๋ค. apply ๋ฉ์๋์ ๋์์ด ์์๋ง๋ค ๋ฌ๋ผ์ผ ํด์ ์์๋ณ ํด๋์ค์ ๋ชธ์ฒด๋ฅผ ์ฌ์ฉํด ๊ฐ ์์์์ apply ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด์ผํ๋ค.
ยท ๋๋ค๋ฅผ ์ด์ฉํ๋ฉด ์ด๊ฑฐ ํ์ ์ ์ธ์คํด์ค ์ด์ฉํ์ฌ, ์์๋ณ๋ก ๋ค๋ฅด๊ฒ ๋์ํ๋ ์ฝ๋๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
๊ฐ ์ด๊ฑฐ ํ์ ์์์ ๋์์ ๋๋ค๋ก ๊ตฌํํด ์์ฑ์์ ๋๊ธฐ๊ณ , ์์ฑ์๋ ์ด ๋๋ค๋ฅผ ์ธ์คํด์ค ํ๋๋ก ์ ์ํด๋๋ค. ๊ทธ๋ฐ ๋ค์ apply ๋ฉ์๋์์ ํ๋์ ์ ์ฅ๋ ๋๋ค๋ฅผ ํธ์ถํ๋ค.
- ์ด๋ ๊ฒ ๊ตฌํํ๋ฉด ์๋ ๋ฒ์ ๋ณด๋ค ๊ฐ๊ฒฐํ๊ณ ๊น๋ํด์ง๋ค.
๋๋ค vs ์์๋ณ ํด๋์ค ๋ชธ์ฒด
ยท ๋๋ค๋ ์ด๋ฆ์ด ์๊ณ , ๋ฌธ์ํ๋ ๋ชป ํ๋ค. ๋ฐ๋ผ์ ์ฝ๋ ์์ฒด๋ก ๋์์ด ๋ช ํํ ์ค๋ช ๋์ง ์๊ฑฐ๋ ์ฝ๋ ์ค ์๊ฐ ๋ง์์ง๋ฉด ์ฐ์ง ๋ง์์ผ ํ๋ค.
ยท ๋๋ค๋ ๊ธธ์ด์ง๋ฉด ๊ฐ๋ ์ฑ์ด ์ฌํ๊ฒ ๋๋น ์ง๋ค.
- ํ ์ค์ผ ๋ ๊ฐ์ฅ ์ข๊ณ , ๊ธธ์ด๋ ์ธ ์ค ์์ ๋๋ด๋ ๊ฒ ์ข๋ค.
- ๋๋ค๊ฐ ๊ธธ๊ฑฐ๋ ์ฝ๊ธฐ ์ด๋ ต๋ค๋ฉด ๋๋ค๋ฅผ ์ฐ์ง ๋ง์์ผ ํ๋ค.
ยท ์ด๊ฑฐ ํ์ ์์ฑ์์ ๋๊ฒจ์ง๋ ์ธ์๋ค์ ํ์ ์ ์ปดํ์ผํ์์ ์ถ๋ก ๋๋ค. ๋ฐ๋ผ์ ์ด๊ฑฐ ํ์ ์์ฑ์ ์์ ๋๋ค๋ ์ด๊ฑฐ ํ์ ์ ์ธ์คํด์ค ๋ฉค๋ฒ์ ์ ๊ทผํ ์ ์๋ค (์ธ์คํด์ค๋ ๋ฐํ์์ ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค).
ยท ์์๋ณ ๋์์ ๋จ ๋ช ์ค๋ก ๊ตฌํํ๊ธฐ ์ด๋ ต๊ฑฐ๋, ์ธ์คํด์ค ํ๋๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ๋ง ํ๋ ์ํฉ์ด๋ฉด, ์์๋ณ ํด๋์ค ๋ชธ์ฒด๋ฅผ ์ฌ์ฉํ์.
๋๋ค vs ์ต๋ช ํด๋์ค
ยท ๋๋ค๋ ํจ์ํ ์ธํฐํ์ด์ค์์๋ง ์ฐ์ด๋ฏ๋ก, ์ถ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ๋๋ค๋ฅผ ์ธ ์ ์์ผ๋ ์ต๋ช ํด๋์ค๋ฅผ ์จ์ผ ํ๋ค.
ยท ์ถ์ ๋ฉ์๋๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ์ธํฐํ์ด์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ์ต๋ช ํด๋์ค๋ฅผ ์ธ ์ ์๋ค.
ยท ํจ์ ๊ฐ์ฒด๊ฐ ์์ ์ ์ฐธ์กฐํด์ผ ํ๋ค๋ฉด ์ต๋ช ํด๋์ค๋ฅผ ์จ์ผ ํ๋ค.
- ๋๋ค๋ ์์ ์ ์ฐธ์กฐํ ์ ์๋ค. ๋๋ค์์ this ํค์๋๋ ๋ฐ๊นฅ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
- ๋ฐ๋ฉด, ์ต๋ช ํด๋์ค์์์ this๋ ์ต๋ช ํด๋์ค์ ์ธ์คํด์ค ์์ ์ ๊ฐ๋ฆฌํจ๋ค.
ยท ๋๋ค๋ ์ต๋ช ํด๋์ค์ฒ๋ผ ์ง๋ ฌํ ํํ๊ฐ ๊ตฌํ๋ณ๋ก(์: ๊ฐ์๋จธ์ ๋ณ๋ก) ๋ค๋ฅผ ์ ์๋ค. ๋ฐ๋ผ์ ๋๋ค๋ฅผ ์ง๋ ฌํํ๋ ์ผ์ ์ผ๊ฐ์ผ ํ๋ค(์ต๋ช ํด๋์ค ์ธ์คํด์ค๋ก ๋ง์ฐฌ๊ฐ์ง).
- ์ง๋ ฌํํด์ผ๋ง ํ๋ ํจ์ ๊ฐ์ฒด๊ฐ ์๋ค๋ฉด(Comparator ๋ฑ) private ์ ์ ์ค์ฒฉ ํด๋์ค(์์ดํ 24)์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์.
์์ดํ
43. ๋๋ค๋ณด๋ค๋ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ผ
ํต์ฌ ์ ๋ฆฌ
ยท ๋ฉ์๋ ์ฐธ์กฐ๋ ๋๋ค์ ๊ฐ๋จ๋ช ๋ฃํ ๋์์ด ๋ ์ ์๋ค. ๋ฉ์๋ ์ฐธ์กฐ ์ชฝ์ด ์งง๊ณ ๋ช ํํ๋ค๋ฉด ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฐ๊ณ , ๊ทธ๋ ์ง ์์ ๋๋ง ๋๋ค๋ฅผ ์ฌ์ฉํ๋ผ.
๋ฉ์๋ ์ฐธ์กฐ
ยท ๋ฉ์๋ ์ฐธ์กฐ(method reference)๋ ํจ์ ๊ฐ์ฒด๋ฅผ ๋๋ค๋ณด๋ค๋ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ฉ์๋ ์ฐธ์กฐ ์ฌ์ฉ ์์
๋ค์ ์ฝ๋๋ ์์์ ํค์ Integer ๊ฐ์ ๋งคํ์ ๊ด๋ฆฌํ๋ ํ๋ก๊ทธ๋จ์ ์ผ๋ถ๋ค. ํค๊ฐ ๋งต ์์ ์๋ค๋ฉด ํค์ ์ซ์ 1์ ๋งคํํ๊ณ , ์ด๋ฏธ ์๋ค๋ฉด ๊ธฐ์กด ๋งคํ ๊ฐ์ ์ฆ๊ฐ์ํจ๋ค.
์ด ์ฝ๋๋ ์๋ฐ 8 ๋ Mpap์ ์ถ๊ฐ๋ merge ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. merge ๋ฉ์๋๋ ํค, ๊ฐ, ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ผ๋ฉฐ, ์ฃผ์ด์ง ํค๊ฐ ๋งต ์์ ์์ง ์๋ค๋ฉด ์ฃผ์ด์ง [ํค, ๊ฐ] ์์ ๊ทธ๋๋ก ์ ์ฅํ๋ค. ๋ฐ๋๋ก ํค๊ฐ ์ด๋ฏธ ์๋ค๋ฉด, ์ธ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์ ํจ์๋ฅผ ํ์ฌ ๊ฐ๊ณผ ์ฃผ์ด์ง ๊ฐ์ ์ ์ฉํ ๋ค์, ๊ทธ ๊ฒฐ๊ณผ๋ก ํ์ฌ ๊ฐ์ ๋ฎ์ด์ด๋ค.
ยท ๋๋ค ๋์ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ ๋ฌํ๋ฉด ๋๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ ๋ณด๊ธฐ ์ข๊ฒ ์ป์ ์ ์๋ค.
- ๋งค๊ฐ๋ณ์ count์ incr๋ ํฌ๊ฒ ํ๋ ์ผ ์์ด ๊ณต๊ฐ์ ๊ฝค ์ฐจ์งํ๋ค.
- ์๋ฐ 8์ด ๋๋ฉด์ ๊ธฐ๋ณธ ํ์ ์ ๋ฐ์ฑ ํ์ ์ ์ด ๋๋ค์ ๊ธฐ๋ฅ์ด ๊ฐ์ ์ ์ ๋ฉ์๋ sum์ ์ ๊ณตํ๊ธฐ ์์ํ๋ค.
๋ฉ์๋ ์ฐธ์กฐ์ ๋๋ค์ ์ฐจ์ด์
ยท ๋งค๊ฐ๋ณ์ ์๊ฐ ๋์ด๋ ์๋ก ๋ฉ์๋ ์ฐธ์กฐ๋ก ์ ๊ฑฐํ ์ ์๋ ์ฝ๋์๋ ๋์ด๋๋ค. ํ์ง๋ง ์ด๋ค ๋๋ค์์๋ ๋งค๊ฐ๋ณ์์ ์ด๋ฆ ์์ฒด๊ฐ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ข์ ๊ฐ์ด๋๊ฐ ๋๊ธฐ๋ ํ๋ค. ์ด๋ฐ ๋๋ค๋ ๊ธธ์ด๋ ๋ ๊ธธ์ง๋ง ๋ฉ์๋ ์ฐธ์กฐ๋ณด๋ค ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง๋ณด์๋ ์ฌ์ธ ์ ์๋ค.
ยท ๋๋ค๋ก ํ ์ ์๋ ์ผ์ด๋ผ๋ฉด ๋ฉ์๋ ์ฐธ์กฐ๋ก๋ ํ ์ ์๋ค.
- ๋จ, ์ ์ผํ ์์ธ๊ฐ ์กด์ฌํ๋ค. ์ ๋ค๋ฆญ ํจ์ ํ์ ๊ตฌํ์ด๋ค. ์ ๋ค๋ฆญ ํจ์ ํ์ ์ ๋ฉ์๋ ์ฐธ์กฐ ํํ์์ผ๋ก๋ ๊ตฌํํ ์ ์์ง๋ง, ๋๋ค์์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ๋ค.
๋ค์๊ณผ ๊ฐ์ ์ธํฐํ์ด์ค ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์๊ฐํด๋ณด์.
์ด๋ ํจ์ํ ์ธํฐํ์ด์ค G๋ฅผ ํจ์ ํ์ ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
ยท ๋ฉ์๋ ์ฐธ์กฐ์๋ ๊ธฐ๋ฅ์ ์ ๋๋ฌ๋ด๋ ์ด๋ฆ์ ์ง์ด์ค ์ ์๊ณ , ์น์ ํ ์ค๋ช ์ ๋ฌธ์๋ก ๋จ๊ธธ ์๋ ์๋ค.
ยท ๋๋ค๊ฐ ๋ฉ์๋ ์ฐธ์กฐ๋ณด๋ค ๊ฐ๊ฒฐํ ๋๊ฐ ์๋ค. ์ฃผ๋ก ๋ฉ์๋์ ๋๋ค๊ฐ ๊ฐ์ ํด๋์ค์ ์์ ๋ ๊ทธ๋ ๋ค.
ex) ๋ค์ ์ฝ๋๊ฐ GoshThisClassNameIsHumongous ํด๋์ค ์์ ์๋ค๊ณ ํด๋ณด์.
์ด๋ฅผ ๋๋ค๋ก ๋์ฒดํ๋ฉด ๋ค์์ฒ๋ผ ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ฉ์๋ ์ฐธ์กฐ ์ชฝ์ ๋ ์งง์ง๋, ๋ ๋ช ํํ์ง๋ ์๋ค. ๋ฐ๋ผ์ ๋๋ค ์ชฝ์ด ๋ซ๋ค.
๊ฐ์ ์ ์์์ java.util.function ํจํค์ง๊ฐ ์ ๊ณตํ๋ ์ ๋ค๋ฆญ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ธ Function.identity()๋ฅผ ์ฌ์ฉํ๊ธฐ๋ณด๋ค๋ ๋๊ฐ์ ๊ธฐ๋ฅ์ (x -> x)๋ฅผ ์ฌ์ฉํ๋ ํธ์ด ์ฝ๋๋ ์งง๊ณ ๋ช ํํ๋ค.
๋ฉ์๋ ์ฐธ์กฐ์ ์ ํ
ยท ๋ฉ์๋ ์ฐธ์กฐ์ ์ ํ์ ๋ค์ฏ ๊ฐ์ง๊ฐ ์๋ค.
1. ์ ์ ๋ฉ์๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฉ์๋ ์ฐธ์กฐ
์ธ์คํด์ค ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๋ ์ ํ ๋ ๊ฐ์ง
2. ์์ ๊ฐ์ฒด(receiving object, ์ฐธ์กฐ ๋์ ์ธ์คํด์ค)๋ฅผ ํน์ ํ๋ ํ์ ์ (bound) ์ธ์คํด์ค ๋ฉ์๋ ์ฐธ์กฐ
- ํ์ ์ ์ฐธ์กฐ๋ ๊ทผ๋ณธ์ ์ผ๋ก ์ ์ ์ฐธ์กฐ์ ๋น์ทํ๋ค. ์ฆ, ํจ์ ๊ฐ์ฒด๊ฐ ๋ฐ๋ ์ธ์์ ์ฐธ์กฐ๋๋ ๋ฉ์๋๊ฐ ๋ฐ๋ ์ธ์๊ฐ ๋๊ฐ๋ค.
3. ์์ ๊ฐ์ฒด๋ฅผ ํน์ ํ์ง ์๋ ๋นํ์ ์ (unbound) ์ธ์คํด์ค ๋ฉ์๋ ์ฐธ์กฐ
- ๋นํ์ ์ ์ฐธ์กฐ์์๋ ํจ์ ๊ฐ์ฒด๋ฅผ ์ ์ฉํ๋ ์์ ์ ์์ ๊ฐ์ฒด๋ฅผ ์๋ ค์ค๋ค. ์ด๋ฅผ ์ํด ์์ ๊ฐ์ฒด ์ ๋ฌ์ฉ ๋งค๊ฐ๋ณ์๊ฐ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ์ฒซ ๋ฒ์งธ๋ก ์ถ๊ฐ๋๋ฉฐ, ๊ทธ ๋ค๋ก๋ ์ฐธ์กฐ๋๋ ๋ฉ์๋ ์ ์ธ์ ์ ์๋ ๋งค๊ฐ๋ณ์๋ค์ด ๋ค๋ฐ๋ฅธ๋ค.
- ๋นํ์ ์ ์ฐธ์กฐ๋ ์ฃผ๋ก ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์์์ ๋งคํ๊ณผ ํํฐ ํจ์์ ์ฐ์ธ๋ค(์์ดํ 45).
4. ํด๋์ค ์์ฑ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฉ์๋ ์ฐธ์กฐ
5. ๋ฐฐ์ด ์์ฑ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ฉ์๋ ์ฐธ์กฐ
- ์์ฑ์ ์ฐธ์กฐ๋ ํฉํฐ๋ฆฌ ๊ฐ์ฒด๋ก ์ฌ์ฉ๋๋ค.
๋ฉ์๋ ์ฐธ์กฐ ์ ํ | ์ | ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ ๋๋ค |
---|---|---|
์ ์ | Integer::parseInt | str -> Integer.parseInt(str) |
ํ์ ์ (์ธ์คํด์ค) | Instant.now::isAfter | Instant then = Instant.now(); t -> then.isAfter(t) |
๋นํ์ ์ (์ธ์คํด์ค) | String::toLowerCase | str -> str.toLowerCase() |
ํด๋์ค ์์ฑ์ | TreeMap<K, V>::new | () -> new TreeMap<K, V>() |
๋ฐฐ์ด ์์ฑ์ | int[]::new | len -> new int[len] |
์์ดํ
44. ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ผ
ํต์ฌ ์ ๋ฆฌ
ยท ์๋ฐ8 ๋ถํฐ ๋๋ค๋ฅผ ์ง์ํ๋ฏ๋ก, API๋ฅผ ์ค๊ณํ ๋ ๋๋ค๋ ์ผ๋์ ๋์ด์ผ ํ๋ค.
ยท ์ ๋ ฅ๊ฐ๊ณผ ๋ฐํ๊ฐ์ ํจ์ํ ์ธํฐํ์ด์ค ํ์ ์ ํ์ฉํ์.
ยท ๋ณดํต java.util.function ํจํค์ง์ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ์ ํ์ด๋ค.
ยท ๋จ, ํ์น๋ ์์ง๋ง ์ง์ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค์ด ์ฐ๋ ํธ์ด ๋ณ์ ์๋ ์๋ค.
๋๋ค์ API ์์ฑ ๋ชจ๋ฒ ์ฌ๋ก
ยท ์๋ฐ๊ฐ ๋๋ค๋ฅผ ์ง์ํ๋ฉด์ API๋ฅผ ์์ฑํ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ ํฌ๊ฒ ๋ฐ๋์๋ค.
- ์์ ํด๋์ค์ ๊ธฐ๋ณธ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํด ์ํ๋ ๋์์ ๊ตฌํํ๋ ํ ํ๋ฆฌ ๋ฉ์๋ ํจํด[Gamma95]์ ๋งค๋ ฅ์ด ํฌ๊ฒ ์ค์๋ค. ์ด๋ฅผ ๋์ฒดํ๋ ํ๋์ ์ธ ํด๋ฒ์ ๊ฐ์ ํจ๊ณผ์ ํจ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ ์ ์ ํฉํฐ๋ฆฌ๋ ์์ฑ์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด๋ค.
ยท ์ ๋ด์ฉ์ ์ผ๋ฐํํ๋ฉด, ํจ์ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ์์ฑ์์ ๋ฉ์๋๋ฅผ ๋ ๋ง์ด ๋ง๋ค์ด์ผ ํ๋ค.
- ์ด๋ ํจ์ํ ๋งค๊ฐ๋ณ์ ํ์ ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ํํด์ผ ํ๋ค.
ํจ์ ๊ฐ์ฒด๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ ์์
LinkedHashMap์ protected ๋ฉ์๋์ธ removeEldestEntry๋ฅผ ์ฌ์ ์ํ๋ฉด ์บ์๋ก ์ฌ์ฉํ ์ ์๋ค. ๋งต์ ์๋ก์ด ํค๋ฅผ ์ถ๊ฐํ๋ put ๋ฉ์๋๋ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ true๊ฐ ๋ฐํ๋๋ฉด ๋งต์์ ๊ฐ์ฅ ์ค๋๋ ์์๋ฅผ ์ ๊ฑฐํ๋ค.
๋ค์ ์ฒ๋ผ removeEldestEntry๋ฅผ ์ฌ์ ์ํ๋ฉด ๋งต์ ๊ฐ์ฅ ์ต๊ทผ ์์ 100๊ฐ๋ฅผ ์ ์งํ๋ค.
์ ์ฝ๋๋ ์ ๋์ํ์ง๋ง, ๋๋ค๋ฅผ ์ฌ์ฉํ๋ฉด ํจ์ฌ ์ ํด๋ผ ์ ์๋ค. LinkedHashMap์ ์ค๋๋ ๋ค์ ๊ตฌํํ๋ค๋ฉด, ํจ์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ ์ ์ ํฉํฐ๋ฆฌ๋ ์์ฑ์๋ฅผ ์ ๊ณตํ์ ๊ฒ์ด๋ค.
removeEldestEntry๋ size()๋ฅผ ํธ์ถํด ๋งต ์์ ์์ ์๋ฅผ ์์๋ธ๋ค. removeEldestEntry๊ฐ ์ธ์คํด์ค ๋ฉ์๋๋ผ ๊ฐ๋ฅํ ๋ฐฉ์์ด๋ค. ํ์ง๋ง ์์ฑ์์ ๋๊ธฐ๋ ํจ์ ๊ฐ์ฒด๋ ์ด ๋งต์ ์ธ์คํด์ค ๋ฉ์๋๊ฐ ์๋๋ค. ํฉํฐ๋ฆฌ๋ ์์ฑ์๋ฅผ ํธ์ถํ ๋๋ ๋งต์ ์ธ์คํด์ค๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ๋งต์ ์๊ธฐ ์์ ๋ ํจ์ ๊ฐ์ฒด์ ๊ฑด๋ค์ค์ผ ํ๋ค.
์ด๋ฅผ ๋ฐ์ํ ํจ์ํ ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด ์ธํฐํ์ด์ค๋ ์ ๋์ํ๋, ๊ตณ์ด ์ฌ์ฉํ ์ด์ ๋ ์๋ค. ์๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ด๋ฏธ ๊ฐ์ ๋ชจ์์ ์ธํฐํ์ด์ค๊ฐ ์ค๋น๋์ด ์๋ค.
ํ์ค ํจ์ํ ์ธํฐํ์ด์ค
ยท java.util.function ํจํค์ง๋ฅผ ๋ณด๋ฉด ๋ค์ํ ์ฉ๋์ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ๋ด๊ฒจ ์๋ค.
ํ์ํ ์ฉ๋์ ๋ง๋ ๊ฒ ์๋ค๋ฉด, ์ง์ ๊ตฌํํ์ง ๋ง๊ณ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ์.
ยท ํ์ค ํจ์ํ ์ธํฐํ์ด์ค ์ฌ์ฉ์ ์ฅ์ :
1. API๊ฐ ๋ค๋ฃจ๋ ๊ฐ๋ ์ ์๊ฐ ์ค์ด ์ตํ๊ธฐ ๋ ์ฌ์ ์ง๋ค.
2. ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๋ค์ ์ ์ฉํ ๋ํดํธ ๋ฉ์๋๋ฅผ ๋ง์ด ์ ๊ณตํ๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ์ฝ๋์์ ์ํธ์ด์ฉ์ฑ๋ ํฌ๊ฒ ์ข์์ง๋ค.
ex) Predicate ์ธํฐํ์ด์ค๋ ํ๋ ๋ํค๋(predicate)๋ค์ ์กฐํฉํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค. LinkedHashMap ์์์๋ ์ง์ ๋ง๋ EledestEntryRemoveFuntion ๋์ ํ์ค ์ธํฐํ์ด์ค์ธ BiPredicate<Map<K, V>>, Map.Entry<K, V>๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ยท java.util.function ํจํค์ง์๋ ์ด 43๊ฐ์ ์ธํฐํ์ด์ค๊ฐ ๋ด๊ฒจ ์๋ค. ๊ทธ ์ค ๊ธฐ๋ณธ ์ธํฐํ์ด์ค 6๊ฐ๋ง ๊ธฐ์ตํ๋ฉด ๋๋จธ์ง๋ฅผ ์ ์ถํ ์ ์๋ค.
- ๊ธฐ๋ณธ ์ธํฐํ์ด์ค๋ค์ ๋ชจ๋ ์ฐธ์กฐ ํ์ ์ฉ์ด๋ค.
๊ธฐ๋ณธ ์ธํฐํ์ด์ค
ยท Operator ์ธํฐํ์ด์ค๋ ์ธ์๊ฐ 1๊ฐ์ธ UnaryOperator์ 2๊ฐ์ธ BinaryOperator๋ก ๋๋๋ฉฐ, _๋ฐํ๊ฐ๊ณผ ์ธ์์ ํ์ ์ด ๊ฐ์ ํจ์_๋ฅผ ๋ปํ๋ค.
ยท Predicate ์ธํฐํ์ด์ค๋ ์ธ์ ํ๋๋ฅผ ๋ฐ์ boolean์ ๋ฐํํ๋ ํจ์๋ฅผ ๋ปํ๋ค.
ยท Function ์ธํฐํ์ด์ค๋ ์ธ์์ ๋ฐํ ํ์ ์ด ๋ค๋ฅธ ํจ์๋ฅผ ๋ปํ๋ค.
ยท Supplier ์ธํฐํ์ด์ค๋ ์ธ์๋ฅผ ๋ฐ์ง ์๊ณ ๊ฐ์ ๋ฐํ(ํน์ ์ ๊ณต)ํ๋ ํจ์๋ฅผ ๋ปํ๋ค.
ยท Consumer ์ธํฐํ์ด์ค๋ ์ธ์๋ฅผ ํ๋ ๋ฐ๊ณ ๋ฐํ๊ฐ์ ์๋(ํนํ ์ธ์๋ฅผ ์๋นํ๋) ํจ์๋ฅผ ๋ปํ๋ค.
๋ค์์ ๊ธฐ๋ณธ ํจ์ํ ์ธํฐํ์ด์ค๋ค์ ์ ๋ฆฌํ ํ๋ค.
๊ธฐ๋ณธ ์ธํฐํ์ด์ค์ ๋ณํ
ยท ๊ธฐ๋ณธ ์ธํฐํ์ด์ค๋ ๊ธฐ๋ณธ ํ์ ์ธ int, long, double์ฉ์ผ๋ก ๊ฐ 3๊ฐ์ฉ ๋ณํ์ด ์๊ธด๋ค.
- ์ด๋ฆ์ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค์ ์ด๋ฆ ์์ ํด๋น ๊ธฐ๋ณธ ํ์ ์ด๋ฆ์ ๋ถ์ฌ ์ง์๋ค.
ex) int๋ฅผ ๋ฐ๋ Predicate๋ IntPredicate, long์ ๋ฐ์ long์ ๋ฐํํ๋ BinaryOperator๋ LongBinaryOperator๊ฐ ๋๋ ์์ด๋ค.
ยท Function์ ๋ณํ์ ์ ์ผํ๊ฒ ๋ฐํ ํ์ ์ด ๋งค๊ฐ๋ณ์ํ๋๋ค.
ex) LongFunction<int[]>์ long ์ธ์๋ฅผ ๋ฐ์ int[]๋ฅผ ๋ฐํํ๋ค.
ยท Function ์ธํฐํ์ด์ค์๋ ๊ธฐ๋ณธ ํ์ ์ ๋ฐํํ๋ ๋ณํ์ด ์ด 9๊ฐ ๋ ์๋ค.
- ์ ๋ ฅ๊ณผ ๊ฒฐ๊ณผ ํ์ ์ด ๋ชจ๋ ๊ธฐ๋ณธ ํ์ ์ด๋ฉด ์ ๋์ด๋ก SrcToResult๋ฅผ ์ฌ์ฉํ๋ค(์ด 6๊ฐ).
ex) long์ ๋ฐ์ int๋ฅผ ๋ฐํํ๋ฉด LongToIntFunction์ด ๋๋ ์์ด๋ค.
- ๋๋จธ์ง๋ ์ ๋ ฅ์ด ๊ฐ์ฒด ์ฐธ์กฐ์ด๊ณ ๊ฒฐ๊ณผ๊ฐ int, long, double์ธ ๋ณํ๋ค๋ก, ์์์ ๋ฌ๋ฆฌ ์ ๋ ฅ์ ๋งค๊ฐ๋ณ์ํํ๊ณ ์ ๋์ด๋ก ToResult๋ฅผ ์ฌ์ฉํ๋ค(์ด 3๊ฐ).
ex) int[] ์ธ์๋ฅผ ๋ฐ์ long์ ๋ฐํํ๋ฉด ToLongFunction<int[]>์ด ๋๋ ์์ด๋ค.
ยท ๊ธฐ๋ณธ ํจ์ํ ์ธํฐํ์ด์ค ์ค 3๊ฐ์๋ ์ธ์๋ฅผ 2๊ฐ์ฉ ๋ฐ๋ ๋ณํ์ด ์๋ค(์ด 6๊ฐ).
- BiPredicate<T, U>, BiFunction<T,U,R>, BiConsumer<T,U>์ด๋ค.
- BiFunction์ ๊ธฐ๋ณธ ํ์ ์ ๋ฐํํ๋ ์ธ ๋ณํ ToIntBiFunction<T,U>, ToLongBiFunction<T,U>, ToDoubleBiFunction<T,U>๊ฐ ์กด์ฌํ๋ค.
ยท Consumer์๋ ๊ฐ์ฒด ์ฐธ์กฐ์ ๊ธฐ๋ณธ ํ์ ํ๋, ์ฆ ์ธ์๋ฅผ 2๊ฐ ๋ฐ๋ ๋ณํ์ธ ObjDoubleConsumer<T>, ObjIntConsumer<T>, ObjLongConsumer<T>๊ฐ ์กด์ฌํ๋ค(์ด 3๊ฐ).
- ์ด๋ ๊ฒ ํด์ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค์ ์ธ์ 2๊ฐ์ง๋ฆฌ ๋ณํ์ ์ด 9๊ฐ๋ค.
ยท BooleanSupplier ์ธํฐํ์ด์ค๋ boolean์ ๋ฐํํ๋๋ก ํ Supplier์ ๋ณํ์ด๋ค.
- ์ด๊ฒ์ ํ์ค ํจ์ํ ์ธํฐํ์ด์ค ์ค boolean์ ์ด๋ฆ์ ๋ช ์ํ ์ ์ผํ ์ธํฐํ์ด์ค๋ค.
- ํ์ง๋ง Predicate์ ๊ทธ ๋ณํ 4๊ฐ๋ boolean ๊ฐ์ ๋ฐํํ ์ ์๋ค.
ยท ํ์ค ํจ์ํ ์ธํฐํ์ด์ค ๋๋ถ๋ถ์ ๊ธฐ๋ณธ ํ์ ๋ง ์ง์ํ๋ค. ํ์ง๋ง ์ฌ๊ธฐ์ ๋ฐ์ฑ๋ ๊ธฐ๋ณธ ํ์ ์ ๋ฃ์ด ์ฌ์ฉํ์ง๋ ๋ง์
- ๊ณ์ฐ๋์ด ๋ง์ ๋ ์ฑ๋ฅ์ด ์ฒ์ฐธํ ๋๋ ค์ง ์ ์๋ค(์์ดํ 61).
์ ์ฉ ํจ์ํ ์ธํฐํ์ด์ค ์ง์ ์์ฑํด์ผ ํ ๋
ยท ๋๋ถ๋ถ ์ํฉ์์ ์ง์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ํ์ค ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ ํธ์ด ๋ซ์ง๋ง, ์ฝ๋๋ฅผ ์ง์ ์์ฑํด์ผํ ๋๋ ์๋ค.
ยท ํ์ค ์ธํฐํ์ด์ค ์ค ํ์ํ ์ฉ๋์ ๋ง๋ ๊ฒ ์๋ค๋ฉด ์ง์ ์์ฑํด์ผ ํ๋ค.
ex) ๋งค๊ฐ๋ณ์ 3๊ฐ๋ฅผ ๋ฐ๋ Predicate, ๊ฒ์ฌ ์์ธ๋ฅผ ๋์ง๋ ๊ฒฝ์ฐ
ยท ๊ตฌ์กฐ์ ์ผ๋ก ๋๊ฐ์ง๋ง, ๋ค์์ ํ๋ ์ด์ ๋ง์กฑํ๋ค๋ฉด ์ง์ ์์ฑํ๋ ๊ฒ์ ๊ณ ๋ คํ๋ค.
1. ์์ฃผ ์ฐ์ด๋ฉฐ, ์ด๋ฆ ์์ฒด๊ฐ ์ฉ๋๋ฅผ ๋ช ํํ ์ค๋ช ํ๋ค.
2. ๋ฐ๋์ ๋ฐ๋ผ์ผ ํ๋ ๊ท์ฝ์ด ์๋ค.
3. ์ ์ฉํ ๋ํดํธ ๋ฉ์๋๋ฅผ ์ ๊ณตํ ์ ์๋ค.
์๋ฅผ ๋ค์ด Comparator<T> ์ธํฐํ์ด์ค๋ ๊ตฌ์กฐ์ ์ผ๋ก ToIntBiFunction<T,U๊ณผ ๋์ผํ์ง๋ง, ์์ ๊ฐ์ ํน์ฑ์ ๋ชจ๋ ์ง๋๊ธฐ ๋๋ฌธ์ ์ ์ฉ ํจ์ํ ์ธํฐํ์ด์ค๊ฐ ๋ง๋ค์ด์ก๋ค.
์ ์ฉ ํจ์ํ ์ธํฐํ์ด์ค ์ค๊ณํ๊ธฐ
ยท ์ ์ฉ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๊ธฐ๋ก ํ๋ค๋ฉด, ์์ฑํ๋ ๊ฒ '์ธํฐํ์ด์ค'์์ ๋ช ์ฌํ๊ณ ์ฃผ์ํด์ ์ค๊ณํด์ผ ํ๋ค.
ยท ํจ์ํ ์ธํฐํ์ด์ค์ @FunctionalInterface ์ ๋ํ ์ด์ ์ ๋ฌ๋ฉด, ๋ค์์ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค.
1. ํด๋น ํด๋์ค์ ์ฝ๋๋ ์ค๋ช ๋ฌธ์๋ฅผ ์ฝ์ ์ด์๊ฒ ๊ทธ ์ธํฐํ์ด์ค๊ฐ ๋๋ค์ฉ์ผ๋ก ์ค๊ณ๋ ๊ฒ์์ ์๋ ค์ค๋ค.
2. ํด๋น ์ธํฐํ์ด์ค๊ฐ ์ถ์ ๋ฉ์๋๋ฅผ ์ค์ง ํ๋๋ง ๊ฐ์ง๊ณ ์์ด์ผ ์ปดํ์ผ๋๊ฒ ํด์ค๋ค.
3. 2๋ฒ์ ๊ฒฐ๊ณผ๋ก, ์ ์ง๋ณด์ ๊ณผ์ ์์ ๋๊ตฐ๊ฐ ์ค์๋ก ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ง ๋ชปํ๊ฒ ๋ง์์ค๋ค.
์์ ๊ฐ์ ์ด์ ์ด ์์ผ๋, ์ง์ ๋ง๋ ํจ์ํ ์ธํฐํ์ด์ค์๋ ํญ์ @FunctionalInterface ์ ๋ํ ์ด์ ์ ์ฌ์ฉํ์.
์ฃผ์ ์ฌํญ! ์๋ก ๋ค๋ฅธ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ ์์น์ ์ธ์๋ก ๋ฐ๋ ๋ฉ์๋๋ค์ ๋ค์ค ์ ์ํด์๋ ์๋๋ค.
- ํด๋ผ์ด์ธํธ์๊ฒ ๋ถํ์ํ ๋ชจํธํจ๋ง ์๊ฒจ์ค๋ค.
ex) ExecutorService์ submit ๋ฉ์๋๋ Callable<T>๋ฅผ ๋ฐ๋ ๊ฒ๊ณผ Runnable์ ๋ฐ๋ ๊ฒ์ ๋ค์ค์ ์ํ๋ค. ๊ทธ๋์ ์ฌ๋ฐ๋ฅธ ๋ฉ์๋๋ฅผ ์๋ ค์ฃผ๊ธฐ ์ํด ํ๋ณํํด์ผ ํ ๋๊ฐ ์์ ์๊ธด๋ค(์์ดํ 52).
์์ดํ
45. ์คํธ๋ฆผ์ ์ฃผ์ํด์ ์ฌ์ฉํ๋ผ
ํต์ฌ ์ ๋ฆฌ
ยท ์คํธ๋ฆผ์ ์ฌ์ฉํด์ผ ๋ฉ์ง๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ์ผ์ด ์๊ณ , ๋ฐ๋ณต ๋ฐฉ์์ด ๋ ์๋ง์ ์ผ๋ ์๋ค.
ยท ๋ง์ ์์ ๋ค์ด ์ด ๋์ ์กฐํฉํ์ ๋ ๊ฐ์ฅ ๋ฉ์ง๊ฒ ํด๊ฒฐ๋๋ค.
ยท ์ด๋ ์ชฝ์ ์ ํํ๋ ํ๊ณ ๋ถ๋ํ ๊ท์น์ ์์ง๋ง ์ฐธ๊ณ ํ ๋งํ ์ง์นจ ์ ๋๋ ์๋ค.
ยท ์ด๋ ์ชฝ์ด ๋์์ง ํ์ฐํ ๋๋ฌ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ฒ ์ง๋ง, ์๋๋๋ผ๋ ๋ฐฉ๋ฒ์ ์๋ค.
ยท ์ด๋ ์ชฝ์ด ๋์์ง ํ์ ํ๊ธฐ ์ด๋ ต๋ค๋ฉด, ๋ ๋ค ํด๋ณด๊ณ ๋ ๋์ ์ชฝ์ ํํ๋ผ.
์คํธ๋ฆผ API์ ํต์ฌ
ยท ์คํ๋ง API์ ๋ชฉ์ : ์คํธ๋ง API๋ ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ (์์ฐจ์ ์ด๋ ๋ณ๋ ฌ์ ์ด๋ )์ ๋๊ณ ์ ์๋ฐ 8์ ์ถ๊ฐ๋์๋ค.
ยท ์คํธ๋ฆผ API๊ฐ ์ ๊ณตํ๋ ์ถ์ ๊ฐ๋ ์ค ํต์ฌ์ ๋ ๊ฐ์ง๋ค.
1. ๋ฐ์ดํฐ ์์์ ์ ํ ๋๋ ๋ฌดํ ์ํธ์ค(sequence)
2. ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ: ์ด ์์๋ค๋ก ์ํํ๋ ์ฐ์ฐ ๋จ๊ณ๋ฅผ ํํํ๋ ๊ฐ๋
- ์คํธ๋ฆผ ์์๋ค์ ์ด๋๋ก๋ถํฐ๋ ์ฌ ์ ์๋ค. ex) ์ปฌ๋ ์ , ๋ฐฐ์ด, ํ์ผ, ์ ๊ทํํ์ ํจํด ๋งค์ฒ, ๋์ ์์ฑ๊ธฐ, ๋ค๋ฅธ ์คํธ๋ฆผ
- ์คํธ๋ฆผ ์์ ๋ฐ์ดํฐ ์์๋ค์ ๊ฐ์ฒด ์ฐธ์กฐ๋ ๊ธฐ๋ณธ ํ์ ๊ฐ์ด๋ค. ๊ธฐ๋ณธ ํ์ ๊ฐ์ผ๋ก int, long, double ์ธ ๊ฐ์ง๋ฅผ ์ง์ํ๋ค.
์คํธ๋ฆผ ํ์ดํ๋ผ์ธ
ยท ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์์ค ์คํธ๋ฆผ์์ ์์ํด ์ข ๋จ ์ฐ์ฐ(terminal operation)์ผ๋ก ๋๋๋ฉฐ, ๊ทธ ์ฌ์ด์ ํ๋ ์ด์์ ์ค๊ฐ ์ฐ์ฐ(intermediate operation)์ด ์์ ์ ์๋ค.
- ๊ฐ ์ค๊ฐ ์ฐ์ฐ์ ์คํธ๋ฆผ์ ์ด๋ ํ ๋ฐฉ์์ผ๋ก ๋ณํ(transform)ํ๋ค. ex) ํน์ ์กฐ๊ฑด์ ๋ง์กฑ ๋ชปํ๋ ์์๋ฅผ ๊ฑธ๋ฌ๋๋ค.
- ๋ณํ๋ ์คํธ๋ฆผ์ ์์ ํ์ ์ ๋ณํ ์ ์คํธ๋ฆผ์ ์์ ํ์ ๊ณผ ๊ฐ์ ์๋ ์๊ณ , ๋ค๋ฅผ ์๋ ์๋ค.
- ์ข ๋จ ์ฐ์ฐ์ ๋ง์ง๋ง ์ค๊ฐ ์ฐ์ฐ์ด ๋ด๋์ ์คํธ๋ฆผ์ ์ตํ์ ์ฐ์ฐ์ ๊ฐํ๋ค. ex) ์์๋ฅผ ์ ๋ ฌํด ์ปฌ๋ ์ ์ ๋ด๊ฑฐ๋, ํน์ ์์ ํ๋๋ฅผ ์ ํํ๊ฑฐ๋, ๋ชจ๋ ์์๋ฅผ ์ถ๋ จํ๋ ์์ด๋ค.
ยท ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์ง์ฐ ํ๊ฐ(lazy evaluation)๋๋ค.
- ํ๊ฐ๋ ์ข ๋จ ์ฐ์ฐ์ด ํธ์ถ๋ ๋ ์ด๋ค์ง๋ฉฐ, ์ข ๋จ ์ฐ์ฐ์ ์ฐ์ด์ง ์๋ ๋ฐ์ดํฐ ์์๋ ๊ณ์ฐ์ ์ฐ์ด์ง ์๋๋ค.
- ์ง์ฐ ํ๊ฐ๋ ๋ฌดํ ์คํธ๋ฆผ์ ๋ค๋ฃฐ ์ ์๊ฒ ํด์ฃผ๋ ์ด์ ๋ค.
์ฃผ์ ์ฌํญ! ์ข ๋จ ์ฐ์ฐ์ ๋นผ๋จน์ง ๋ง์. ์ข ๋จ ์ฐ์ฐ์ด ์๋ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์๋ฌด ์ผ๋ ํ์ง ์๋๋ค.
ยท ์คํธ๋ฆผ API๋ ๋ฉ์๋ ์ฐ์๋ฅผ ์ง์ํ๋ ํ๋ฃจ์ธํธ API๋ค.
- ์ฆ, ํ์ดํ๋ผ์ธ ํ๋๋ฅผ ๊ตฌ์ฑํ๋ ๋ชจ๋ ํธ์ถ์ ์ฐ๊ฒฐํ์ฌ ๋จ ํ๋์ ํํ์์ผ๋ก ์์ฑํ ์ ์๋ค.
- ํ์ดํ๋ผ์ธ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ฐ๊ฒฐํด ํํ์ ํ๋๋ก ๋ง๋ค ์ ์๋ค.
ยท ๊ธฐ๋ณธ์ ์ผ๋ก ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์์ฐจ์ ์ผ๋ก ์ํ๋๋ค.
- ํ์ดํ๋ผ์ธ์ ๋ณ๋ ฌ๋ก ์คํํ๋ ค๋ฉด ํ์ดํ๋ผ์ธ์ ๊ตฌ์ฑํ๋ ์คํธ๋ฆผ ์ค ํ๋์์ parallel ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋๋ค.
ํ์ง๋ง ํจ๊ณผ๋ฅผ ๋ณผ ์ ์๋ ์ํฉ์ ๋ง์ง ์๋ค(์์ดํ 48).
ยท ์คํธ๋ฆผ API๋ ๋ค์ฌ๋ค๋ฅํ์ฌ ์ฌ์ค์ ์ด๋ ํ ๊ณ์ฐ๋ ํ ์ ์๋ค.
์คํธ๋ฆผ์ ๊ณผ์ฉ
ยท ์คํธ๋ฆผ์ ์ ๋๋ก ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์งง๊ณ ๊น๋ํด์ง์ง๋ง, ์๋ชป ์ฌ์ฉํ๋ฉด ์ฝ๊ธฐ ์ด๋ ต๊ณ ์ ์ง๋ณด์๋ ํ๋ค์ด์ง๋ค.
์ฌ์ ํ์ผ์์ ๋จ์ด๋ฅผ ์ฝ์ด ์ฌ์ฉ์๊ฐ ์ง์ ํ ๋ฌธํฑ๊ฐ๋ณด๋ค ์์ ์๊ฐ ๋ง์ ์๋๊ทธ๋จ ๊ทธ๋ฃน์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์ดํด๋ณด์.
- ์๋๊ทธ๋จ: ์ฒ ์๋ฅผ ๊ตฌ์ฑํ๋ ์ํ๋ฒณ์ ๊ฐ๊ณ ์์๋ง ๋ค๋ฅธ ๋จ์ด
ํ๋ก๊ทธ๋จ ์ค๋ช โ
๋๋ณด๊ธฐ
ํ๋ก๊ทธ๋จ์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ์์ ๋งต์ ๊ฐ ๋จ์ด๋ฅผ ์ฝ์ ํ ๋ ์๋ฐ 8์ ์ถ๊ฐ๋ computeIfAbsent ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ ํค์ ๊ฐ์ ๋งคํํด๋๊ณ , ๊ณ์ฐ๋ ๊ฐ์ ๋ฐํํ๋ค.
- computeIfAbsent: ๋งต ์์ ํค๊ฐ ์๋์ง ์ฐพ์ ๋ค์, ์์ผ๋ฉด ๊ทธ ํค์ ๋งคํ๋ ๊ฐ์ ๋ฐํํ๋ค. ํค๊ฐ ์์ผ๋ฉด ๊ฑด๋ค์ง ํจ์ ๊ฐ์ฒด๋ฅผ ํค์ ์ ์ฉํ์ฌ ๊ฐ์ ๊ณ์ฐํด๋ธ ๋ค์ ๊ทธ ํค์ ๊ฐ์ ๋งคํํด๋๊ณ , ๊ณ์ฐ๋ ๊ฐ์ ๋ฐํํ๋ค.
๋ค์ ํ๋ก๊ทธ๋จ์ ์์ ์ฝ๋์ ๊ฐ์ ์ผ์ ํ์ง๋ง ์คํธ๋ฆผ์ ๊ณผํ๊ฒ ํ์ฉํ๋ค.
- ์ฌ์ ํ์ผ์ ์ฌ๋ ๋ถ๋ถ๋ง ์ ์ธํ๋ฉด ํ๋ก๊ทธ๋จ ์ ์ฒด๊ฐ ๋จ ํ๋์ ํํ์์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
- ์งง์ง๋ง ์ฝ๊ธฐ ์ด๋ ต๋ค.
์ด์ฒ๋ผ ์คํธ๋ฆผ์ ๊ณผ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ฝ๊ฑฐ๋ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์์ง๋ค.
๋ค์์ ํ๋ก๊ทธ๋จ์ ์์ ๋ ํ๋ก๊ทธ๋จ๊ณผ ๊ฐ์ง๋ง ์คํธ๋ฆผ์ ์ ๋นํ ์ฌ์ฉํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ์๋ ์ฝ๋๋ณด๋ค ์งง์ ๋ฟ ์๋๋ผ ๋ช ํํ๋ค.
alphabetize ๋ฉ์๋๋ ์คํธ๋ฆผ์ ์ฌ์ฉํด ๋ค๋ฅด๊ฒ ๊ตฌํํ ์ ์์ง๋ง, ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ช ํ์ฑ์ด ๋จ์ด์ง๊ณ ์๋ชป ๊ตฌํํ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๋ค. ์ฌ์ง์ด ๋๋ ค์ง ์๋ ์๋ค. ์๋ฐ๊ฐ ๊ธฐ๋ณธ ํ์ ์ธ char์ฉ ์คํธ๋ฆผ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
ยท ๋๋ค ๋งค๊ฐ๋ณ์์ ์ด๋ฆ์ ์ฃผ์ํด์ ์ ํ์.
- ๋๋ค์์๋ ํ์ ์ด๋ฆ์ ์์ฃผ ์๋ตํ๋ฏ๋ก ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์ ์ง์ด์ผ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ๊ฐ๋์ฑ์ด ์ ์ง๋๋ค.
- ์ ์ฝ๋์์ ๋งค๊ฐ๋ณ์ g๋ ์ฌ์ค group์ด ๋ผ๊ณ ํ๋๊ฒ ๋ซ๋ค.
ยท ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ์ ์ ํ ํ์ฉํ๋ ์ผ์ ์ค์์ฑ์ ์ผ๋ฐ ๋ฐ๋ณต ์ฝ๋์์๋ณด๋ค๋ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์์ ํจ์ฌ ํฌ๋ค.
- ํ์ดํ๋ผ์ธ์์๋ ํ๋ฆฝ ์ ๋ณด๊ฐ ๋ช ์ ๋์ง ์๊ฑฐ๋ ์์ ๋ณ์๋ฅผ ์์ฃผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ ์ฝ๋์์๋ ๋จ์ด์ ์ฒ ์๋ฅผ ์ํ๋ฒณ์์ผ๋ก ์ ๋ ฌํ๋ ์ผ์ ๋ณ๋ ๋ฉ์๋์ธ alphabetize์์ ์ํํ๋ค. ์ด๋ฅผ ํตํด ์ฐ์ฐ์ ์ ์ ํ ์ด๋ฆ์ ์ง์ด์ฃผ๊ณ , ์ธ๋ถ ๊ตฌํ์ ์ฃผ ํ๋ก๊ทธ๋จ ๋ก์ง ๋ฐ์ผ๋ก ๋นผ๋ด ์ ์ฒด์ ์ธ ๊ฐ๋ ์ฑ์ ๋์ธ๋ค.
ยท ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ๋ํ์ด๋๋ ๊ณ์ฐ์ ํจ์ ๊ฐ์ฒด๋ก ํํํ๊ณ , ๋ฐ๋ณต ์ฝ๋์์๋ ์ฝ๋ ๋ธ๋ก์ ์ฌ์ฉํด ํํํ๋ค.
์คํธ๋ฆผ๊ณผ char
๋ค์์ char ๊ฐ๋ค์ ์คํธ๋ฆผ์ผ๋ก ์ฒ๋ฆฌํ๋ ์ฝ๋๋ค.
์ ์ฝ๋๋ Hello world!๋ฅผ ์ถ๋ ฅํ๋ฆฌ๋ผ ๊ธฐ๋๋์ง๋ง, 721011081081113211911111410810033์ ์ถ๋ ฅํ๋ค.
"Hello world!".chars()๊ฐ ๋ฐํํ๋ ์คํธ๋ฆผ์ ์์๋ char๊ฐ ์๋ int ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ฒ๋ผ ์ด๋ฆ์ด chars์ธ๋ฐ int ์คํธ๋ฆผ์ ๋ฐํํ๋ฉด ํท๊ฐ๋ฆด ์ ์๋ค. ์ฌ๋ฐ๋ฅธ print ๋ฉ์๋๋ฅผ ํธ์ถํ๊ฒ ํ๋ ค๋ฉด ๋ค์์ฒ๋ผ ํ๋ณํ์ ๋ช ์์ ์ผ๋ก ํด์ค์ผํ๋ค.
ยท ํ์ง๋ง char ๊ฐ๋ค์ ์ฒ๋ฆฌํ ๋๋ ์คํธ๋ฆผ์ ์ผ๊ฐ๋ ํธ์ด ๋ซ๋ค.
์คํธ๋ฆผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ
ยท ์คํธ๋ฆผ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ ๊ฐ๋ฅํด๋ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ์ํด ๋ณผ ์ ์์ผ๋ฏ๋ก ์ฃผ์ํ์.
ยท ์คํธ๋ฆผ๊ณผ ๋ฐ๋ณต๋ฌธ์ ์ ์ ํ ์กฐํฉํ๋ ๊ฒ ์ต์ ์ด๋ค.
ยท ๊ธฐ์กด ์ฝ๋๋ ์คํธ๋ฆผ์ ์ฌ์ฉํ๋๋ก ๋ฆฌํฉํฐ๋งํ๋, ์ ์ฝ๋๊ฐ ๋ ๋์ ๋ณด์ผ ๋๋ง ๋ฐ์ํ์.
์ฝ๋๋ธ๋ญ์ ์์ฑ๋ง์ถค์ธ ์ผ
ยท ํจ์ ๊ฐ์ฒด๋ก๋ ํ ์ ์์ง๋ง, ์ฝ๋ ๋ธ๋ก์ผ๋ก๋ ํ ์ ์๋ ์ผ๋ค์ด๋ค.
1. ์ฝ๋ ๋ธ๋ก์์๋ ๋ฒ์ ์์ ์ง์ญ๋ณ์๋ฅผ ์ฝ๊ณ ์์ ํ ์ ์๋ค. ํ์ง๋ง ๋๋ค์์๋ final์ด๊ฑฐ๋ ์ฌ์ค์ final์ธ ๋ณ์๋ง ์ฝ์ ์ ์๊ณ , ์ง์ญ๋ณ์๋ฅผ ์์ ํ๋ ๊ฑด ๋ถ๊ฐ๋ฅํ๋ค.
2. ์ฝ๋ ๋ธ๋ก์์๋ return ๋ฌธ์ ์ฌ์ฉํด ๋ฉ์๋์์ ๋น ์ ธ๋๊ฐ๊ฑฐ๋, break๋ continue ๋ฌธ์ผ๋ก ๋ธ๋ก ๋ฐ๊นฅ์ ๋ฐ๋ณต๋ฌธ์ ์ข ๋ฃํ๊ฑฐ๋ ๋ฐ๋ณต์ ํ ๋ฒ ๊ฑด๋๋ธ ์ ์๋ค. ๋ํ ๋ฉ์๋ ์ ์ธ์ ๋ช ์๋ ๊ฒ์ฌ ์์ธ๋ฅผ ๋์ง ์ ์๋ค. ๋๋ค๋ก๋ ์ด์ค ์ด๋ค ๊ฒ๋ ํ ์ ์๋ค.
์คํธ๋ฆผ์ ์์ฑ๋ง์ถค์ธ ์ผ
ยท ์ด ์ค ํ๋๋ฅผ ์ํํ๋ ๋ก์ง์ด๋ผ๋ฉด, ์คํธ๋ฆผ์ ์ ์ฉํ๊ธฐ ์ข์ ํ๋ณด๋ค.
1. ์์๋ค์ ์ํธ์ค๋ฅผ ์ผ๊ด๋๊ฒ ๋ณํํ๋ค.
2. ์์๋ค์ ์ํธ์ค๋ฅผ ํํฐ๋งํ๋ค.
3. ์์๋ค์ ์ํธ์ค๋ฅผ ํ๋์ ์ฐ์ฐ์ ์ฌ์ฉํด ๊ฒฐํฉํ๋ค. ex) ๋ํ๊ธฐ, ์ฐ๊ฒฐํ๊ธฐ, ์ต์๊ฐ ๊ตฌํ๊ธฐ ๋ฑ
4. ์์๋ค์ ์ํธ์ค๋ฅผ ์ปฌ๋ ์ ์ ๋ชจ์๋ค(์๋ง๋ ๊ณตํต๋ ์์ฑ์ ๊ธฐ์ค์ผ๋ก ๋ฌถ์ด๊ฐ๋ฉฐ).
5. ์์๋ค์ ์ํธ์ค์์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ฅผ ์ฐพ๋๋ค.
์คํธ๋ฆผ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ด๋ ค์ด ์ผ
ยท ๋ํ์ ์ธ ์: ํ ๋ฐ์ดํฐ๊ฐ ํ์ดํ๋ผ์ธ์ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ํต๊ณผํ ๋ ์ด ๋ฐ์ดํฐ์ ๊ฐ ๋จ๊ณ์์ ๊ฐ๋ค์ ๋์์ ์ ๊ทผํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ
- ์์ธ: ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์ผ๋จ ํ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ ๋งคํํ๊ณ ๋๋ฉด ์๋์ ๊ฐ์ ์ฝ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ ๊ฐ๊ณผ ์๋ก์ด ๊ฐ์ ์์ ์ ์ฅํ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ๋งคํํ๋ ์ฐํ ๋ฐฉ๋ฒ๋ ์์ง๋ง, ๋ง์กฑ์ค๋ฌ์ด ํด๋ฒ์ ์๋๋ค. ํนํ ๋งคํ ๊ฐ์ฒด๊ฐ ํ์ํ ๋จ๊ณ๊ฐ ์ฌ๋ฌ ๊ณณ์ด๋ฉด ๋ ๊ทธ๋ ๋ค.
- ์ด๋ฐ ๋ฐฉ์์ ์ฝ๋ ์๋ ๋ง๊ณ ์ง์ ๋ถํ์ฌ ์คํธ๋ฆผ์ ์ฐ๋ ์ฃผ๋ชฉ์ ์์ ๋ฒ์ด๋๋ค.
๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ผ๋ฉด, ์ ๋จ๊ณ์ ๊ฐ์ด ํ์ํ ๋ ๋งคํ์ ๊ฑฐ๊พธ๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ด ๋ซ๋ค.
์ฒ์ 20๊ฐ์ ๋ฉ๋ฅด์ผ ์์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์. ๋ฉ๋ฅด์ผ ์๋ 2^p - 1 ํํ์ ์๋ค. p๊ฐ ์์๋ฉด, ํด๋น ๋ฉ์์ผ ์๋ ์์์ผ ์ ์๋๋ฐ, ์ด๋ฅผ ๋ฉ๋ฅด์ผ ์์๋ผ ํ๋ค. ์ด ํ์ดํ๋ผ์ธ์ ์ฒซ ์คํธ๋ฆผ์ผ๋ก๋ ๋ชจ๋ ์์๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
๋ค์ ์ฝ๋๋ ๋ฌดํ ์คํธ๋ฆผ์ ๋ฐํํ๋ ๋ฉ์๋๋ค. BigInteger์ ์ ์ ๋ฉค๋ฒ๋ค์ ์ ์ ์ํฌํธํ์ฌ ์ฌ์ฉํ๋ค.
๋ฉ์๋ ์ด๋ฆ primes๋ ์คํธ๋ฆผ์ ์์๊ฐ ์์์์ ๋งํด์ค๋ค.
- ์คํธ๋ฆผ์ ๋ฐํํ๋ ๋ฉ์๋ ์ด๋ฆ์ ์ด์ฒ๋ผ ์์์ ์ ์ฒด๋ฅผ ์๋ ค์ฃผ๋ ๋ณต์ ๋ช ์ฌ๋ก ์ฐ๊ธฐ๋ฅผ ์ถ์ฒํ๋ค. ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ๊ฐ๋ ์ฑ์ด ํฌ๊ฒ ์ข์์ง ๊ฒ์ด๋ค.
Stream.iterate๋ผ๋ ์ ์ ํฉํฐ๋ฆฌ๋ ๋งค๊ฐ๋ณ์๋ฅผ 2๊ฐ ๋ฐ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์คํธ๋ฆผ์ ์ฒซ ๋ฒ์งธ ์์๊ณ , ๋ ๋ฒ์งธ๋ ์คํธ๋ฆผ์์ ๋ค์ ์์๋ฅผ ์์ฑํด์ฃผ๋ ํจ์๋ค.
๋ค์์ ์ฒ์ 20๊ฐ์ ๋ฉ๋ฅด์ผ ์์๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ด๋ค. ์์๋ค์ ์ฌ์ฉํด ๋ฉ๋ฅด์ผ ์๋ฅผ ๊ณ์ฐํ๊ณ , ๊ฒฐ๊ณผ๊ฐ์ด ์์์ธ ๊ฒฝ์ฐ๋ง ๋จ๊ธฐ๊ณ , ๊ฒฐ๊ณผ ์คํธ๋ฆผ์ ์์ ์๋ฅผ 20๊ฐ๋ก ์ ํํ๊ณ , ์์ ์ด ๋๋๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
- ๋งค์ง๋๋ฒ 50์ ์์์ฑ ๊ฒ์ฌ๊ฐ true๋ฅผ ๋ฐํํ ํ๋ฅ ์ ์ ์ดํ๋ค.
๊ฐ ๋ฉ๋ฅด์ผ ์์์ ์ ์ง์(p)๋ฅผ ์ถ๋ ฅํ๊ธธ ์ํ์๊ณ ํด๋ณด์. ์ฒซ ๋ฒ์งธ ์ค๊ฐ ์ฐ์ฐ์์ ์ํํ ๋งคํ์ ๊ฑฐ๊พธ๋ก ์ํํด ๋ฉ๋ฅด์ผ ์์ ์ง์๋ฅผ ์ฝ๊ฒ ๊ณ์ฐํ ์ ์๋ค.
์ง์๋ ๋จ์ํ ์ซ์๋ฅผ ์ด์ง์๋ก ํํํ ๋ค์ ๋ช ๋นํธ์ธ์ง ์ธ๋ฉด ๋์ค๋ฏ๋ก, ์ข ๋จ ์ฐ์ฐ์ ๋ค์์ฒ๋ผ ์์ฑํ๋ฉด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
์คํธ๋ฆผ๊ณผ ๋ฐ๋ณต ์ค ์ด๋ ์ชฝ์ ์จ์ผ ํ ์ง ๋ฐ๋ก ์๊ธฐ ์ด๋ ค์ด ์์
์ด๋ฌํ ์์ ์ ์๋ก ์นด๋ ๋ฑ์ ์ด๊ธฐํํ๋ ์์ ์ ์๊ฐํด๋ณด์. ์นด๋๋ ์ซ์(rank)์ ๋ฌด๋ฌ(suit)์ ๋ฌถ์ ๋ถ๋ณ ๊ฐ ํด๋์ค์ด๊ณ , ์ซ์์ ๋ฌด๋ฌ๋ ๋ชจ๋ ์ด๊ฑฐ ํ์ ์ด๋ค.
์ด ์์ ์ ๋ ์งํฉ์ ์์๋ค๋ก ๋ง๋ค ์ ์๋ ๊ฐ๋ฅํ ๋ชจ๋ ์กฐํฉ์ ๊ณ์ฐํ๋ ๋ฌธ์ ๋ค. ์ํ์๋ค์ ์ด๋ฅผ ๋ ์งํฉ ๋ฐ์นด๋ฅดํธ ๊ณฑ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ค์์ for-each ๋ฐ๋ณต๋ฌธ์ ์ค์ฒฉํด ๊ตฌํํ ์ฝ๋๋ค.
๋ค์์ ์คํธ๋ฆผ์ผ๋ก ๊ตฌํํ ์ฝ๋๋ค. ์ค๊ฐ ์ฐ์ฐ์ผ๋ก ์ฌ์ฉํ flatMap์ ์คํธ๋ฆผ์ ์์ ๊ฐ๊ฐ์ ํ๋์ ์คํธ๋ฆผ์ผ๋ก ๋งคํํ ๋ค์, ๊ทธ ์คํธ๋ฆผ๋ค์ ๋ค์ ํ๋์ ์คํธ๋ฆผ์ผ๋ก ํฉ์น๋ค. ์ด๋ฅผ ์ํด ์ค์ฒฉ๋ ๋๋ค๋ฅผ ์ฌ์ฉํ๋ค.
- ์ด๋ฅผ ํํํ(flattening)์ด๋ผ๊ณ ํ๋ค.
ยท ์ด๋ฌํ ๋ ์ฝ๋๋ ๊ฐ์ธ์ ์ทจํฅ๊ณผ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์ ๋ฌธ์ ๋ค.
- ์ดํดํ๊ณ ์ ์ง ๋ณด์ํ๊ธฐ์ ์ฒ์ ์ฝ๋๊ฐ ๋ ํธํ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ง์ ๊ฒ์ด๋ค.
- ์คํธ๋ฆผ ๋ฐฉ์์ด ๋์ ๋ณด์ด๊ณ , ๋๋ฃ๋ค๋ ์คํธ๋ฆผ ์ฝ๋๋ฅผ ์ดํดํ ์ ์๊ณ ์ ํธํ๋ค๋ฉด ์คํธ๋ฆผ ๋ฐฉ์์ ์ฌ์ฉํ์.
- ํ์ ์ด ์์ง ์๋๋ค๋ฉด, ์ฒซ ๋ฒ์งธ ๋ฐฉ์์ ์ฐ๋ ๊ฒ ์์ ํ ๊ฒ์ด๋ค.
์์ดํ
46. ์คํธ๋ฆผ์์๋ ๋ถ์์ฉ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ผ
ํต์ฌ ์ ๋ฆฌ
ยท ์คํ๋ฆผ ํ์ดํ๋ผ์ธ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ ๋ถ์์ฉ ์๋ ํจ์ ๊ฐ์ฒด์ ์๋ค.
ยท ์คํธ๋ฆผ๋ฟ ์๋๋ผ ์คํธ๋ฆผ ๊ด๋ จ ๊ฐ์ฒด์ ๊ฑด๋ค์ง๋ ๋ชจ๋ ํจ์ ๊ฐ์ฒด๊ฐ ๋ถ์์ฉ์ด ์์ด์ผ ํ๋ค.
ยท ์ข ๋จ ์ฐ์ฐ ์ค forEach๋ ์คํธ๋ฆผ์ด ์ํํ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ ๋๋ง ์ด์ฉํด์ผ ํ๋ค. ๊ณ์ฐ ์์ฒด์๋ ์ด์ฉํ์ง ๋ง์.
ยท ์คํธ๋ฆผ์ ์ฌ๋ฐ๋ก ์ฌ์ฉํ๋ ค๋ฉด ์์ง๊ธฐ๋ฅผ ์ ์์๋ฌ์ผ ํ๋ค.
- ๊ฐ์ฅ ์ค์ํ ์์ง๊ธฐ ํฉํฐ๋ฆฌ๋ toList, toSet, toMap, groupingBy, joining์ด๋ค.
์คํธ๋ฆผ API์ ํน์ง
ยท ์คํ๋ฆผ์ ๊ทธ์ ๋ ํ๋์ API๊ฐ ์๋, ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ์ดํ ํจ๋ฌ๋ค์์ด๋ค.
- ์คํธ๋ฆผ์ด ์ ๊ณตํ๋ ํํ๋ ฅ, ์๋, ๋ณ๋ ฌ์ฑ์ ์ป์ผ๋ ค๋ฉด API ๋ฟ๋ง ์๋๋ผ ์ด ํจ๋ฌ๋ค์๊น์ง ํจ๊ป ๋ฐ์๋ค์ฌ์ผ ํ๋ค.
ยท ์คํธ๋ฆผ ํจ๋ฌ๋ค์์ ํต์ฌ์ ๊ณ์ฐ์ ์ผ๋ จ์ ๋ณํ์ผ๋ก ์ฌ๊ตฌ์ฑ ํ๋ ๋ถ๋ถ์ด๋ค. ์ด๋ ๊ฐ ๋ณํ ๋จ๊ณ๋ ๊ฐ๋ฅํ ์ด์ ๋จ๊ณ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ์์ ํจ์์ฌ์ผ ํ๋ค.
- ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ค๊ฐ ๋จ๊ณ๋ ์ข ๋จ ๋จ๊ณ๋ ์คํธ๋ฆผ ์ฐ์ฐ์ ๊ฑด๋ค๋ ํจ์ ๊ฐ์ฒด๋ ๋ชจ๋ ๋ถ์์ฉ(side effect)์ด ์์ด์ผ ํ๋ค.
- ์์ ํจ์: ์ค์ง ์ ๋ ฅ๋ง์ด ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ํจ์๋ค. ๋ค๋ฅธ ๊ฐ๋ณ ์ํ๋ฅผ ์ฐธ์กฐํ์ง ์๊ณ , ํจ์ ์ค์ค๋ก๋ ๋ค๋ฅธ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค.
์คํธ๋ฆผ ํจ๋ฌ๋ค์์ ์ดํดํ์ง ๋ชปํ ์์
๋ค์์ ํ ์คํธ ํ์ผ์์ ๋จ์ด๋ณ ์๋ฅผ ์ธ์ด ๋น๋ํ๋ก ๋ง๋๋ ํ๋ก๊ทธ๋จ์ด๋ค.
์คํธ๋ฆผ, ๋๋ค, ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๊ณ , ๊ฒฐ๊ณผ๋ ์ฌ๋ฐ๋ฅด์ง๋ง ์คํธ๋ฆผ ์ฝ๋๋ผ ํ ์ ์๋ค. ์คํธ๋ฆผ ์ฝ๋๋ฅผ ๊ฐ์ฅํ ๋ฐ๋ณต์ฝ๋๋ค.
- ์คํธ๋ฆผ API์ ์ด์ ์ ์ด๋ฆฌ์ง ๋ชปํ์ฌ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ฐ๋ณต์ ์ฝ๋๋ณด๋ค ๊ธธ๊ณ , ์ด๋ ต๊ณ , ์ ์ง๋ณด์์๋ ์ข์ง ์๋ค.
ยท ๋ฌธ์ ์ : forEach์์ ์ธ๋ถ ์ํ(๋น๋ํ)๋ฅผ ์์ ํ๋ ๋๋ค๋ฅผ ์คํํ๋ค.
์คํธ๋ฆผ์ ์ ๋๋ก ํ์ฉํ ์์
๋ค์์ ์ ์ฝ๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์์ ํ ๋ชจ์ต์ด๋ค.
ยท ์ด์ ์ฝ๋์ ๊ฐ์ ์ผ์ ํ์ง๋ง, ์ด๋ฒ์ ์คํธ๋ฆผ API๋ฅผ ์ ๋๋ก ์ฌ์ฉํ๊ณ , ์งง๊ณ ๋ช ํํ๋ค.
ยท forEach ์ฐ์ฐ์ ์คํธ๋ฆผ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ํ ๋๋ง ์ฌ์ฉํ๊ณ , ๊ณ์ฐํ๋ ๋ฐ๋ ์ฐ์ง ๋ง์.
- forEach ์ฐ์ฐ์ ์ข ๋จ ์ฐ์ฐ ์ค ๊ธฐ๋ฅ์ด ๊ฐ์ฅ ์ ๊ณ , ๊ฐ์ฅ '๋' ์คํธ๋ฆผ๋ต๋ค. ๋๋๊ณ ๋ฐ๋ณธ์ ์ด์ด์ ๋ณ๋ ฌํํ ์๋ ์๋ค.
ยท Scanner์ ์คํธ๋ฆผ ๋ฉ์๋์ธ tokens๋ฅผ ์ฌ์ฉํด ์คํธ๋ฆผ์ ์ป์๋ค.
- ์๋ฐ 9๋ถํฐ ์ง์ํ๋ ๋ฉ์๋๋ก, ๊ทธ ์ด์ ๋ฒ์ ์ ์ฐ๋ ์ฌ๋์ ์ด๋ํฐ๋ฅผ ์ด์ฉํ์ฌ (Iterator๋ฅผ ๊ตฌํํ) Scanner๋ฅผ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ ์ ์๋ค. ์์ดํ 47์์ ์ฌ์ฉ๋๋ streamOf(Iterable<E>)๊ฐ ์ข์ ์๋ค.
์คํธ๋ฆผ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ ๊ธฐ์ - ์์ง๊ธฐ(collector)
ยท ์ ์ฝ๋์์ ์ฌ์ฉํ๋ ์์ง๊ธฐ(collector)๋ ์คํธ๋ฆผ์ ์ฌ์ฉํ๋ ค๋ฉด ๊ผญ ๋ฐฐ์์ผํ๋ ๊ฐ๋ ์ด๋ค.
- ์์ง๊ธฐ๊ฐ ์์ฑํ๋ ๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ์ปฌ๋ ์ ์ด๋ฉฐ, ๊ทธ๋์ "collector"๋ผ๋ ์ด๋ฆ์ ์ด๋ค.
ยท java.util.Collectors ํด๋์ค๋ ๋ฉ์๋๋ฅผ 39๊ฐ๋ ๊ฐ์ง๊ณ ์๊ณ , ํ์ ๋งค๊ฐ๋ณ์๊ฐ 5๊ฐ๋ ๋์ง๋ง, ๋ณต์กํ ์ธ๋ถ ๋ด์ฉ์ ์ ๋ชฐ๋ผ๋ ์ด API์ ์ฅ์ ์ ๋๋ถ๋ถ ํ์ฉํ ์ ์๋ค.
- Collector ์ธํฐํ์ด์ค๋ฅผ ์ถ์(reduction) ์ ๋ต์ ์บก์ํํ ๋ธ๋๋ฐ์ค ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ ์๋ ์๋ค.
- ์ถ์: ์คํธ๋ฆผ์ ์์๋ค์ ๊ฐ์ฒด ํ๋์ ์ทจํฉํ๋ค๋ ๋ป
์ปฌ๋ ์ ๊ณผ ์คํธ๋ฆผ
ยท ์์ง๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํธ๋ฆผ์ ์์๋ฅผ ์์ฝ๊ฒ ์ปฌ๋ ์ ์ผ๋ก ๋ชจ์ ์ ์๋ค.
ยท ํด๋น ๊ธฐ๋ฅ์ ํ๋ ์์ง๊ธฐ๋ ์ด ์ธ ๊ฐ์ง๋ก toList(), toSet(), toCollection(collectionFactory)๊ฐ ๊ทธ ์ฃผ์ธ๊ณต์ด๋ค.
- ์ด๋ค์ ์ฐจ๋ก๋ก ๋ฆฌ์คํธ, ์งํฉ, ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ํ ์ปฌ๋ ์ ํ์ ์ ๋ฐํํ๋ค.
์์ ๋ฐฐ์ด ์ง์์ ํ์ฉํด ๋น๋ํ์์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ๊ฐ์ฅ ํํ ๋จ์ด 10๊ฐ๋ฅผ ๋ฝ์๋ด๋ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ด๋ค.
๋งต๊ณผ ์คํธ๋ฆผ
ยท Collectors์ ๋๋จธ์ง 36๊ฐ ๋ฉ์๋ ์ค ๋๋ถ๋ถ์ ์คํธ๋ฆผ์ ๋งต์ผ๋ก ์ทจํฉํ๋ ๊ธฐ๋ฅ์ด๋ค.
- ์ด๋ ์ปฌ๋ ์ ์ ์ทจํฉํ๋ ๊ฒ๋ณด๋ค ๋ณผ์กํ๋ค.
- ์คํธ๋ฆผ์ ๊ฐ ์์๋ ํค ํ๋์ ๊ฐ ํ๋์ ์ฐ๊ด๋์ด ์๋ค. ๋ค์์ ์คํธ๋ฆผ ์์๊ฐ ๊ฐ์ ํค์ ์ฐ๊ด๋ ์๋ ์๋ค.
ยท ๊ฐ์ฅ ๊ฐ๋จํ ๋งต ์์ง๊ธฐ: toMap(keyMap, valueMapper)
- ์คํธ๋ฆผ ์์๋ฅผ ํค์ ๋งคํํ๋ ํจ์์ ๊ฐ์ ๋งคํํ๋ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค.
ํด๋น ์์ง๊ธฐ๋ ์์ดํ 34์์ ์ด๊ฑฐ ํ์ ์์์ ๋ฌธ์์ด ํํ์ ์ด๊ฑฐ ํ์ ์์ฒด์ ๋งคํํ๋ fromString์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉํ๋ค.
์คํธ๋ฆผ์ ๊ฐ ์์๊ฐ ๊ณ ์ ํ ํค์ ๋งคํ๋์ด ์์ ๋ ์ ํฉํ๋ค. ์คํธ๋ฆผ ์์ ๋ค์๊ฐ ๊ฐ์ ํค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํ์ดํ๋ผ์ธ์ด IllegalStateException์ ๋์ง๋ฉด ์ข ๋ฃ๋๋ค.
ยท ๋ณต์กํ ํํ์ toMap์ด๋ groupingBy๋ ์ด๋ฐ ์ถฉ๋์ ๋ค๋ฃจ๋ ๋ค์ํ ์ ๋ต์ ์ ๊ณตํ๋ค.
ex) toMap์ ํค ๋งคํผ์ ๊ฐ ๋งคํผ์ ํจ๊ป ๋ณํฉ(merge) ํจ์๊น์ง ์ ๊ณตํ ์ ์๋ค. ๋ณํฉ ํจ์์ ํํ๋ BinaryOperator<U>์ด๋ฉฐ, ์ฌ๊ธฐ์ U๋ ํด๋น ๋งต์ ๊ฐ ํ์ ์ด๋ค. ๊ฐ์ ํค๋ฅผ ๊ณต์ ํ๋ ๊ฐ๋ค์ ์ด ๋ณํฉ ํจ์๋ฅผ ์ฌ์ฉํด ๊ธฐ์กด ๊ฐ์ ํฉ์ณ์ง๋ค. ์์ปจ๋ ๋ณํฉ ํจ์๊ฐ ๊ณฑ์ ์ด๋ฉด, ํค๊ฐ ๊ฐ์ ๋ชจ๋ ๊ฐ(ํค/๊ฐ ๋งคํผ๊ฐ ์ ํจ)์ ๊ณฑํ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค.
ยท ์ธ์ 3๊ฐ๋ฅผ ๋ฐ๋ toMap์ ์ด๋ค ํค์ ๊ทธ ํค์ ์ฐ๊ด๋ ์์๋ค ์ค ํ๋๋ฅผ ๊ณจ๋ผ ์ฐ๊ด ์ง๋ ๋งต์ ๋ง๋ค ๋ ์ ์ฉํ๋ค.
๋ค์ ์ฝ๋๋ ๋ค์ํ ์์ ๊ฐ์ ์จ๋ฒ๋ค์ ๋ด์ ์คํธ๋ฆผ์ ๊ฐ์ง๊ณ , ์์ ๊ฐ์ ๊ทธ ์์ ๊ฐ์ ๋ฒ ์คํธ ์จ๋ฒ์ ์ฐ๊ด ์ง๋๋ค.
๋น๊ต์๋ก BinaryOperator์์ ์ ์ ์ํฌํธํ maxBy๋ผ๋ ์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. maxBy๋ Comparator<T>๋ฅผ ์ ๋ ฅ๋ฐ์ BinaryOperator<T>๋ฅผ ๋๋ ค์ค๋ค. ์ด ๊ฒฝ์ฐ ๋น๊ต์ ์์ฑ ๋ฉ์๋์ธ comparing์ด maxBy์ ๋๊ฒจ์ค ๋น๊ต์๋ฅผ ๋ฐํํ๋๋ฐ, ์์ ์ ํค ์ถ์ถ ํจ์๋ก Album:sales๋ฅผ ๋ฐ์๋ค.
ํด๋น ์ฝ๋๋ ๋๋๊ฒ๋ ์ฐ๋ฆฌ๊ฐ ํ๋ คํ ๋ฌธ์ ๋ฅผ ๊ทธ๋๋ก ๊ธฐ์ ํ ์ฝ๋๊ฐ ๋์๋ค. "์จ๋ฒ ์คํธ๋ฆผ์ ๋งต์ผ๋ก ๋ฐ๊พธ๋๋ฐ, ์ด ๋งต์ ๊ฐ ์์ ๊ฐ์ ๊ทธ ์์ ๊ฐ์ ๋ฒ ์คํธ ์จ๋ฒ์ ์ง์ง์ ๊ฒ์ด๋ค"
ยท ์ธ์๊ฐ 3๊ฐ์ธ toMap์ ์ถฉ๋์ด ๋๋ฉด ๋ง์ง๋ง ๊ฐ์ ์ทจํ๋ (last-write-wins) ์์ง๊ธฐ๋ฅผ ๋ง๋ค ๋๋ ์ ์ฉํ๋ค.
๋ง์ ์คํธ๋ฆผ์ ๊ฒฐ๊ณผ๊ฐ ๋น๊ฒฐ์ ์ ์ด๋ค. ํ์ง๋ง ๋งคํ ํจ์๊ฐ ํค ํ๋์ ์ฐ๊ฒฐํด์ค ๊ฐ๋ค์ด ๋ชจ๋ ๊ฐ์ ๋, ํน์ ๊ฐ์ด ๋ค๋ฅด๋๋ผ๋ ๋ชจ๋ ํ์ฉ๋๋ ๊ฐ์ผ ๋ ์ด๋ ๊ฒ ๋์ํ๋ ์์ง๊ธฐ๊ฐ ํ์ํ๋ค.
ยท ์ธ์๊ฐ 4๊ฐ์ธ toMap์ ๋ค ๋ฒ์งธ ์ธ์๋ก ๋งต ํฉํฐ๋ฆฌ๋ฅผ ๋ฐ๋๋ค.
- ์ด ์ธ์๋ก EnumMap์ด๋ TreeMap์ฒ๋ผ ์ํ๋ ํน์ ๋งต ๊ตฌํ์ฒด๋ฅด ์ง์ ์ง์ ํ ์ ์๋ค.
ยท ์ ์ธ ๊ฐ์ง toMap์๋ ๋ณ์ข ์ด ์๋ค. ๊ทธ์ค toConcurrentMap์ ๋ณ๋ ฌ ์คํ๋ ํ ๊ฒฐ๊ณผ๋ก ConcurrentHashMap ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ค.
groupingBy
ยท Collectors๊ฐ ์ ๊ณตํ๋ ๋ฉ์๋๋ก ์ ๋ ฅ์ผ๋ก ๋ถ๋ฅ ํจ์(classifier)๋ฅผ ๋ฐ๊ณ , ์ถ๋ ฅ์ผ๋ก๋ ์์๋ฅผ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ๋ชจ์ ๋์ ๋งต์ ๋ด์ ์์ง๊ธฐ๋ฅผ ๋ฐํํ๋ค.
- ๋ถ๋ฅํจ์๋ ์ ๋ ฅ๋ฐ์ ์์๊ฐ ์ํ๋ ์นดํ ๊ณ ๋ฅผ ๋ฐํํ๋ค. ์ด ์นดํ ๊ณ ๋ฆฌ๋ ํด๋น ์์์ ๋งต ํค๋ก ์ฐ์ธ๋ค.
ยท ์ฒซ ๋ฒ์งธ ๋ฒ์ : groupingBy ์ค ํํ๊ฐ ๊ฐ์ฅ ๊ฐ๋จํ ๊ฒ์ ๋ถ๋ฅ ํจ์ ํ๋๋ฅผ ์ธ์๋ก ๋ฐ์ ๋งต์ ๋ฐํํ๋ค.
- ๋ฐํ๋ ๋งต์ ๋ด๊ธด ๊ฐ๊ฐ์ ๊ฐ์ ํด๋น ์นดํ ๊ณ ๋ฆฌ์ ์ํ๋ ์์๋ฅผ ๋ด์ ๋ฆฌ์คํธ๋ค.
์ด๋ ์์ดํ 45์ ์๋๊ทธ๋จ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ ์์ง๊ธฐ๋ก, ์ํ๋ฒณํํ ๋จ์ด๋ฅผ ์ํ๋ฒณํ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ ๋จ์ด๋ค์ ๋ฆฌ์คํธ๋ก ๋งคํํ๋ ๋งต์ ์์ฑํ๋ค.
ยท ๋ ๋ฒ์งธ ๋ฒ์ : ๋ถ๋ฅํจ์์ ํจ๊ป ๋ค์ด์คํธ๋ฆผ ์์ง๊ธฐ๋ฅผ ๋ช ์ํ๋ฉด, groupingBy๊ฐ ๋ฐํํ๋ ์์ง๊ธฐ๊ฐ ๋ฆฌ์คํธ ์ด์ธ์ ๊ฐ์ ๊ฐ๋ ๋งต์ ์์ฑํ ์ ์๋ค.
- ์คํธ๋ฆผ ์์ง๊ธฐ์ ์ญํ : ์นดํ ๊ณ ๋ฆฌ์ ๋ชจ๋ ์์๋ฅผ ๋ด์ ์คํธ๋ฆผ์ผ๋ก๋ถํฐ ๊ฐ์ ์์ฑํ๋ค.
- ์ด ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ toSet()์ ๋๊ธฐ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด groupingBy๋ ์์๋ค์ ๋ฆฌ์คํธ๊ฐ ์๋ ์งํฉ(Set)์ ๊ฐ์ผ๋ก ๊ฐ๋ ๋งต์ ๋ง๋ ๋ค.
- toCollection(collectionFactory)๋ฅผ ๊ฑด๋ค๋ฉด, ์ปฌ๋ ์ ์ ๊ฐ์ผ๋ก ๊ฐ๋ ๋งต์ ์์ฑํ๋ค.
- counting()์ ๊ฑด๋ค๋ฉด, ๊ฐ ์นดํ ๊ณ ๋ฆฌ(ํค)๋ฅผ ํด๋น ์นดํ ๊ณ ๋ฆฌ์ ์ํ๋ ์์์ ๊ฐ์(๊น)์ ๋งคํํ ๋งต์ ์ป๋๋ค.
ยท ์ธ ๋ฒ์งธ ๋ฒ์ : ์์ ๋งค๊ฐ๋ณ์์ ์ถ๊ฐ๋ก ๋งต ํฉํฐ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ๋ฅผ ์ง์ ํ๋ฉด, ๋งต๊ณผ ๊ทธ์์ ๋ด๊ธด ์ปฌ๋ ์ ์ ํ์ ์ ๋ชจ๋ ์ง์ ํ ์ ์๋ค.
- ์๋ฅผ ๋ค์ด TreeSet์ธ TreeMap์ ๋ฐํํ๋ ์์ง๊ธฐ๋ฅผ ๋ง๋ค ์ ์๋ค.
- ์ด ๋ฉ์๋๋ ์ ์ธต์ ์ธ์ ๋ชฉ๋ก ํจํด(telescoping argument list pattern)์ ์ด๊ธ๋๋ค. ์ฆ, mapFactory ๋งค๊ฐ๋ณ์๊ฐ downStream ๋งค๊ฐ๋ณ์๋ณด๋ค ์์ ๋์ธ๋ค.
ยท ์ ์ธ ๊ฐ์ง groupingBy ๊ฐ๊ฐ์ ๋์ํ์ฌ ๋ฉ์๋์ ๋์ ์ํ ๋ฒ์ ์ธ groupingByConcurrent ๋ฉ์๋๋ ์๋ค.
- ํด๋น ๋ฉ์๋๋ ConcurrentHashMap ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ค๋ค.
ยท goupingBy์ ์ฌ์ด๊ฒฉ์ธ partitionBy๋ ๋ถ๋ฅ ํจ์ ์๋ฆฌ์ ํ๋ ๋ํคํธ(predicate)๋ฅผ ๋ฐ๊ณ ํค๊ฐ Boolean์ธ ๋งต์ ๋ฐํํ๋ค.
- ํ๋ ๋ํคํธ์ ๋ํด ๋ค์ด์คํธ๋ฆผ ์์ง๊ธฐ๊น์ง ์ ๋ ฅ๋ฐ๋ ๋ฒ์ ๋ ๋ค์ค์ ์๋์ด ์๋ค.
- ๋ง์ด ์ฐ์ด์ง๋ ์๋๋ค.
๊ทธ์ธ ๋ฉ์๋
ยท counting ๋ฉ์๋๊ฐ ๋ฐํํ๋ ์์ง๊ธฐ๋ ๋ค์ด์คํธ๋ฆผ ์์ง๊ธฐ ์ ์ฉ์ด๋ค.
- Stream์ count ๋ฉ์๋๊ฐ ์ง์ ์ฌ์ฉํ์ฌ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ ์ ์์ผ๋ collect(counting()) ํํ๋ก ์ฌ์ฉํ ์ผ์ ์ ํ ์๋ค.
- Collections์๋ ์ด๋ฐ ์์ฑ์ ๋ฉ์๋๊ฐ 16๊ฐ ๋ ์๋ค. ๊ทธ์ค 9๊ฐ๋ ์ด๋ฆ์ด summing, averaging, summarizing์ผ๋ก ์์ํ๋ฉฐ, ๊ฐ๊ฐ int, long, double ์คํธ๋ฆผ์ฉ์ผ๋ก ํ๋์ฉ ์กด์ฌํ๋ค.
ยท ๋ค์ค์ ์๋ reducing ๋ฉ์๋๋ค, filteing, mapping, flatMapping, collectingAndThen ๋ฉ์๋๊ฐ ์๋๋ฐ, ๋๋ถ๋ถ ํ๋ก๊ทธ๋๋จธ๋ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๊ณ ์์ด๋ ์๊ด์๋ค.
- ์ค๊ณ ๊ด์ ์์ ๋ณด๋ฉด, ์ด ์์ง๊ธฐ๋ค์ ์คํธ๋ฆผ ๊ธฐ๋ฅ์ ์ผ๋ถ๋ฅผ ๋ณต์ ํ์ฌ ๋ค์ด์คํธ๋ฆผ ์์ง๊ธฐ๋ฅผ ์์ ์คํธ๋ฆผ์ฒ๋ผ ๋์ํ๊ฒ ํ ๊ฒ์ด๋ค.
ยท Collectors์๋ ์ด์ธ์๋ 3๊ฐ์ ๋ฉ์๋๊ฐ ์กด์ฌํ๋๋ฐ, ์์ง๊ณผ๋ ๊ด๋ จ์ด ์๋ค.
ยท minBy, maxBy๋ ์ธ์๋ก ๋ฐ์ ๋น๊ต์๋ฅผ ์ด์ฉํด ์คํธ๋ฆผ์์ ๊ฐ์ด ๊ฐ์ฅ ์์ ํน์ ๊ฐ์ฅ ํฐ ์์๋ฅผ ๋ฐํํ๋ค.
- Stream ์ธํฐํ์ด์ค์ min๊ณผ max ๋ฉ์๋๋ฅผ ์ด์ง ์ผ๋ฐํํ ๊ฒ์ด๋ค.
- java.util.function.BinaryOperator์ minBy์ maxBy ๋ฉ์๋๊ฐ ๋ฐํํ๋ ์ด์ง ์ฐ์ฐ์ ์์ง๊ธฐ ๋ฒ์ ์ด๋ค.
- joining์ CharSequence ์ธ์คํด์ค์ ์คํธ๋ฆผ์๋ง ์ ์ฉํ ์ ์๋ค.
- ๋งค๊ฐ๋ณ์๊ฐ ์๋ joining์ ๋จ์ํ ์์๋ค์ ์ฐ๊ฒฐํ๋ ์์ง๊ธฐ๋ฅผ ๋ฐํํ๋ค.
- ์ธ์๊ฐ 1๊ฐ์ธ joining์ CharSequence ํ์ ์ ๊ตฌ๋ถ๋ฌธ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๊ฒฐ ๋ถ์์ ์ด ๊ตฌ๋ถ๋ฌธ์๋ฅผ ์ฝ์ ํ๋ค.
ex) ๊ตฌ๋ถ๋ฌธ์๋ก ์ผํ(,)๋ฅผ ์ ๋ ฅํ๋ฉด CSV ํํ์ ๋ฌธ์์ด ์์ฑํ๋ค. ๋จ, ์คํธ๋ฆผ์ ์ฝํ๋ฅผ ์ด๋ฏธ ํฌํจํ ์์๊ฐ ์๋ค๋ฉด ๊ตฌ๋ถ๋ฌธ์์ ๊ตฌ๋ณ๋์ง ์์ผ๋ ์ ๋ ํ์.
- ์ธ์๊ฐ 3๊ฐ์ธ joining์ ๊ตฌ๋ถ๋ฌธ์์ ๋ํด ์ ๋๋ฌธ์(prefix)์ ์ ๋ฏธ๋ฌธ์(suffix)๋ ๋ฐ๋๋ค.
ex) ์ ๋, ๊ตฌ๋ถ, ์ ๋ฏธ๋ฌธ์๋ฅผ '[', ',', ']'๋ก ์ง์ ํ์ฌ ์ป์ ์์ง๊ธฐ๋ [came, saw, conquered]๊ฐ์ ๋ฌธ์์ด์ ์์ฑํ๋ค.
์์ดํ
47. ๋ฐํ ํ์
์ผ๋ก๋ ์คํธ๋ฆผ๋ณด๋ค ์ปฌ๋ ์
์ด ๋ซ๋ค
ํต์ฌ ์ ๋ฆฌ
ยท ์์ ์ํธ์ค๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ์์ฑํ ๋๋, ์ด๋ฅผ ์คํธ๋ฆผ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํ๋ ์ฌ์ฉ์์ ๋ฐ๋ณต์ผ๋ก ์ฒ๋ฆฌํ๊ธธ ์ํ๋ ์ฌ์ฉ์๊ฐ ๋ชจ๋ ์์์ ๋ ์ฌ๋ฆฌ๊ณ , ์์ชฝ์ ๋ค ๋ง์กฑ์ํค๋ ค ๋ ธ๋ ฅํ์.
ยท ์ปฌ๋ ์ ์ ๋ฐํํ ์ ์๋ค๋ฉด ๊ทธ๋ ๊ฒ ํ์.
ยท ๋ฐํ ์ ๋ถํฐ ์ด๋ฏธ ์์๋ค์ ์ปฌ๋ ์ ์ ๋ด์ ๊ด๋ฆฌํ๊ณ ์๊ฑฐ๋ ์ปฌ๋ ์ ์ ํ๋ ๋ ๋ง๋ค์ด๋ ๋ ์ ๋๋ก ์์ ๊ฐ์๊ฐ ์ ๋ค๋ฉด ArrayList ๊ฐ์ ํ์ค ์ปฌ๋ ์ ์ ๋ด์ ๋ฐํํ์. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ ์ฉ ์ปฌ๋ ์ ์ ๊ตฌํํ ์ง ๊ณ ๋ฏผํ์.
ยท ์ปฌ๋ ์ ์ ๋ฐํํ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ๋ฉด ์คํธ๋ฆผ๊ณผ Iterable ์ค ๋ ์์ฐ์ค๋ฌ์ด ๊ฒ์ ๋ฐํํ๋ผ.
- ๋ง์ฝ ๋์ค์ Stream ์ธํฐํ์ด์ค๊ฐ Iterable์ ์ง์ํ๋๋ก ์๋ฐ๊ฐ ์์ ๋๋ค๋ฉด, ๊ทธ๋๋ ์์ฌํ๊ณ ์คํธ๋ฆผ์ ๋ฐํํ๋ฉด ๋ ๊ฒ์ด๋ค(์คํธ๋ฆผ ์ฒ๋ฆฌ์ ๋ฐ๋ณต ๋ชจ๋์์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก).
์๋ฐ8 ์ด์ ์ ๋ฐํ ํ์
ยท ์ผ๋ จ์ ์์๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ ์์ ์ด ๋ง์ผ๋ฉฐ, ์๋ฐ 7๊น์ง๋ ์ด๋ฐ ๋ฉ์๋์ ๋ฐํ ํ์ ์ผ๋ก Collection, Set, List ๊ฐ์ ์ปฌ๋ ์ ์ธํฐํ์ด์ค ๋๋ Iterable์ด๋ ๋ฐฐ์ด์ ์ผ๋ค.
- ๊ธฐ๋ณธ์ ์ปฌ๋ ์ ์ธํฐํ์ด์ค์๊ณ for-each ๋ฌธ์์๋ง ์ฐ์ด๊ฑฐ๋, ๋ฐํ๋ ์์ ์ํธ์ค๊ฐ contains(Obejct) ๊ฐ์ ์ผ๋ถ Collection ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์์ ๋๋ Iterable ์ธํฐํ์ด์ค๋ฅผ ์ผ๋ค.
- ๋ฐํ ์์๋ค์ด ๊ธฐ๋ณธ ํ์ ์ด๊ฑฐ๋ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์ํฉ์ด๋ผ๋ฉด ๋ฐฐ์ด์ ์ผ๋ค.
์๋ฐ8 ์ดํ์ ๋ฐํ ํ์
ยท ์๋ฐ8์์ ์คํธ๋ฆผ์ด ๋ฑ์ฅํ๋ฉด์ ๋ฐํ ํ์ ์ ์ ํ์ด ๋ณต์กํ ์ผ์ด ๋์๋ค.
Steam๊ณผ Iterable
ยท ์์ ์ํธ์ค๋ฅผ ๋ฐํํ ๋๋ ๋น์ฐํ ์คํธ๋ฆผ์ ์ฌ์ฉํด์ผํ๋ค. ํ์ง๋ง, ์คํธ๋ฆผ์ ๋ฐ๋ณต(iteration)์ ์ง์ํ์ง ์๋ ๋ฌธ์ ๊ฐ ์๋ค.
- Stream ์ธํฐํ์ด์ค๋ Iterable ์ธํฐํ์ด์ค๊ฐ ์ ์ํ ์ถ์ ๋ฉ์๋๋ฅผ ์ ๋ถ ํฌํจํ๋ฉฐ, Iterable ์ธํฐํ์ด์ค๊ฐ ์ ์ํ ๋ฐฉ์๋๋ก ๋์ํ๋ค. ํ์ง๋ง Stream์ด Iterable์ ํ์ฅ(extend)ํ์ง ์์์ for-each๋ก ์คํธ๋ฆผ์ ๋ฐ๋ณตํ ์ ์๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ค ๋ฉ์ง ์ฐํ๋ก๋ ์๋ค.
Stream์ iterator ๋ฉ์๋์ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ๊ฑด๋ค๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ง๋ง, ๋ค์ ์ฝ๋๋ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ธ๋ค.
์ด ์ค๋ฅ๋ฅผ ๊ณ ์น๋ ค๋ฉด, ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ๋งค๊ฐ๋ณ์ํ๋ Iterable๋ก ์ ์ ํ ํ๋ณํํด์ผ ํ๋ค. ์๋์ ํ์ง๋ง ์ค์ ์ ์ฐ๊ธฐ์ ๋์กํ๊ณ , ์ง๊ด์ฑ์ด ๋จ์ด์ง๋ค.
์ด๋ํฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ํฉ์ด ๋์์ง๋ค. ์๋ฐ๋ ์ด๋ฐ ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง ์์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค.
- ์๋ฐ์ ํ์ ์ถ๋ก ์ด ๋ฌธ๋งฅ์ ์ ํ์ ํ์ฌ ์ด๋ํฐ ๋ฉ์๋ ์์์ ๋ฐ๋ก ํ๋ณํํ์ง ์์๋ ๋๋ค.
์ด๋ํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ค ์คํธ๋ฆผ๋ for-each ๋ฌธ์ผ๋ก ๋ฐ๋ณตํ ์ ์๋ค.
ยท Iterable์์ Steam์ ๊ธฐ๋ฅ์ด ํ์ํ ๊ฒฝ์ฐ๋ ์๋ค.
- ์์ดํ 45์ ์๋๊ทธ๋จ ํ๋ก๊ทธ๋จ์์ ์คํธ๋ฆผ ๋ฒ์ ์ ์ฌ์ ์ ์ฝ์ ๋ Files.lines ๋ฉ์๋๋ฅผ ์ด์ฉํ๊ณ , ๋ฐ๋ณต ๋ฒ์ ์ ์ค์บ๋๋ฅผ ์ด์ฉํ๋ค.
- ๋ ์ค ํ์ผ์ ์ฝ๋ ๋์ ๋ฐ์ํ๋ ๋ชจ๋ ์์ธ๋ฅผ ์์์ ์ฒ๋ฆฌํด์ค๋ค๋ ์ ์์ Files.lines ์ชฝ์ด ๋ ์ฐ์ํ๋ค.
- ์ด์์ ์ผ๋ก๋ ๋ฐ๋ณต ๋ฒ์ ์์๋ Files.lines๋ฅผ ์จ์ผ ํ๋ค.
API๊ฐ Iterable๋ง ๋ฐํํ๋ฉด, ์ด๋ฅผ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ด๋ํฐ๋ฅผ ๊ตฌํํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- ์๋ฐ๋ ์ด๋ฅผ ์ํ ์ด๋ํฐ๋ ์ ๊ณตํ์ง ์๋๋ค.
ยท ๊ฐ์ฒด ์ํธ์ค๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ์์ฑํ๋๋ฐ, ์ด ๋ฉ์๋๊ฐ ์ค์ง ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์์๋ง ์ฐ์ผ ๊ฑธ ์๋ค๋ฉด ์คํธ๋ฆผ์ ๋ฐํํ์.
ยท ๋ฐํ๋ ๊ฐ์ฒด๋ค์ด ๋ฐ๋ณต๋ฌธ์์๋ง ์ฐ์ผ ๊ฑธ ์๋ค๋ฉด Iterable์ ๋ฐํํ์.
ยท ๊ณต๊ฐ API๋ฅผ ์์ฑํ ๋๋ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์ฌ์ฉํ๋ ์ฌ๋๊ณผ ๋ฐ๋ณต๋ฌธ์์ ์ฐ๋ ค๋ ์ฌ๋ ๋ชจ๋๋ฅผ ๋ฐฐ๋ คํด์ผ ํ๋ค.
- ์ฌ์ฉ์ ๋๋ถ๋ถ์ด ํ ๋ฐฉ์๋ง ์ฌ์ฉํ ๊ฑฐ๋ผ๋ ๊ทผ๊ฑฐ๊ฐ ์๋ค๋ฉด ๋ง์ด๋ค.
Collection ์ธํฐํ์ด์ค
ยท ์์ ์ํธ์ค๋ฅผ ๋ฐํํ๋ ๊ณต๊ฐ API์ ๋ฐํ ํ์ ์๋ Collection์ด๋ ๊ทธ ํ์ ํ์ ์ ์ฐ๋ ๊ฒ ์ผ๋ฐ์ ์ผ๋ก ์ต์ ์ด๋ค.
- Collection ์ธํฐํ์ด์ค๋ Iterable์ ํ์ ํ์ ์ด๊ณ , stream ๋ฉ์๋๋ ์ ๊ณตํ๋ ๋ฐ๋ณต๊ณผ ์คํธ๋ฆผ์ ๋์์ ์ง์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ยท Arrays ์ญ์ Arrays.asList์ Stream.of ๋ฉ์๋๋ก ์์ฝ๊ฒ ๋ฐ๋ณต๊ณผ ์คํธ๋ฆผ์ ์ง์ํ ์ ์๋ค.
ยท ๋ฐํํ๋ ์ํธ์ค์ ํฌ๊ธฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค๋ ์์ ํ ๋งํผ ์๋ค๋ฉด ArrayList๋ HashSet ๊ฐ์ ํ์ค ์ปฌ๋ ์ ๊ตฌํ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ ์ต์ ์ผ ์ ์๋ค. ํ์ง๋ง ๋จ์ง ์ปฌ๋ ์ ์ ๋ฐํํ๋ค๋ ์ด์ ๋ก ๋ฉ์น ํฐ ์ํธ์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค์๋ ์ ๋๋ค.
์ ์ฉ ์ปฌ๋ ์
ยท ๋ฐํํ ์ํธ์ค๊ฐ ํฌ์ง๋ง ํํ์ ๊ฐ๊ฒฐํ๊ฒ ํ ์ ์๋ค๋ฉด ์ ์ฉ ์ปฌ๋ ์ ์ ๊ตฌํํ๋ ๋ฐฉ์์ ๊ฒํ ํ์.
์ฃผ์ด์ง ์งํฉ์ ๋ฉฑ์งํฉ์ ๋ฐํํ๋ ์ํฉ์ ์๊ฐํ์.
- ๋ฉฑ์งํฉ: ํ ์งํฉ์ ๋ชจ๋ ๋ถ๋ถ์งํฉ์ ์์๋ก ํ๋ ์งํฉ
{a, b, c}์ ๋ฉฑ์งํฉ์ {{}, {a}, {b}, {c}, {a, b}, {a, c}, {b, c}, {a, b, c}}๋ค. ์์ ๊ฐ์๊ฐ n๊ฐ๋ฉด ๋ฉฑ์งํฉ์ ์์ ๊ฐ์๋ 2^n์ด ๋๋ค. ๋ฐ๋ผ์ ๋ฉฑ์งํฉ์ ํ์ค ์ปฌ๋ ์ ๊ตฌํ์ฒด์ ์ ์ฅํ๋ ค๋ ์๊ฐ์ ์ํํ๋ค. ํ์ง๋ง, AbstractList๋ฅผ ์ด์ฉํ๋ฉด ํ๋ฅญํ ์ ์ฉ ์ปฌ๋ ์ ์ ์์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
๋น๊ฒฐ์ ๋ฉฑ์งํฉ์ ๊ตฌ์ฑํ๋ ๊ฐ ์์์ ์ธ๋ฑ์ค๋ฅผ ๋นํธ ๋ฒกํฐ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์ธ๋ฑ์ค์ n๋ฒ์งธ ๋นํธ ๊ฐ์ ๋ฉฑ์งํฉ์ ํด๋น ์์๊ฐ ์๋ ์งํฉ์ n๋ฒ์งธ ์์๋ฅผ ํฌํจํ๋์ง ์ฌ๋ถ๋ฅผ ์๋ ค์ค๋ค. ๋ฐ๋ผ์ 0๋ถํฐ 2^n - 1๊น์ง์ ์ด์ง์์ ์์ n๊ฐ์ธ ์งํฉ์ ๋ฉฑ์งํฉ๊ณผ ์์ฐ์ค๋ฝ๊ฒ ๋งคํ๋๋ค.
ยท AbstractCollection์ ํ์ฉํด์ Collection ๊ตฌํ์ฒด๋ฅผ ์์ฑํ ๋๋ Iterable์ฉ ๋ฉ์๋ ์ธ์ contains์ size๋ง ๋ ๊ตฌํํ๋ฉด ๋๋ค. ์ด ๋ฉ์๋๋ค์ ์์ฝ๊ฒ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
ยท (๋ฐ๋ณต์ด ์์๋๊ธฐ ์ ์๋ ์ํธ์ค์ ๋ด์ฉ์ ํ์ ํ ์ ์๋ ๋ฑ์ ์ฌ์ ๋ก) contains์ size๋ฅผ ๊ตฌํํ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ ๋๋ ์ปฌ๋ญ์ผ๋ณด๋ค ์คํธ๋ฆผ์ด๋ Iterable์ (๋๋ ๋ ๋ค๋ฅผ) ๋ฐํํ๋ ํธ์ด ๋ซ๋ค.
ยท Collection์ ๋ฐํ ํ์ ์ผ๋ก ์ธ ๋์ ๋จ์ :
- ์ ์ฝ๋์์ ์ ๋ ฅ ์งํฉ์ ์์ ์๊ฐ 30์ ๋์ผ๋ฉด PowerSet.of๊ฐ ์์ธ๋ฅผ ๋์ง๋ค. ์ด๋ Stream์ด๋ Iterable์ด ์๋ Collection์ ๋ฐํ ํ์ ์ผ๋ก ์ธ ๋์ ๋จ์ ์ ์ ๋ณด์ฌ์ค๋ค.
- Collection์ size ๋ฉ์๋๊ฐ int ๊ฐ์ ๋ฐํํ๋ฏ๋ก PowerSet.of๊ฐ ๋ฐํ๋๋ ์ํธ์ค์ ์ต๋ ๊ธธ์ด๋ Integer.MAX_VALUE ํน์ 2^32 -1๋ก ์ ํ๋๋ค.
- Collection ๋ช ์ธ์ ๋ฐ๋ฅด๋ฉด ์ปฌ๋ ์ ์ด ๋ ํฌ๊ฑฐ๋ ์ฌ์ง์ด ๋ฌดํ์ผ ๋ size๊ฐ 2^31 -1์ ๋ฐํํด๋ ๋์ง๋ง ๋ง์กฑ์ค๋ฌ์ด ํด๋ฒ์ ์๋๋ค.
ยท ๋๋ก๋ ๋จ์ํ ๊ตฌํํ๊ธฐ ์ฌ์ด ์ชฝ์ ์ ํํ๊ธฐ๋ ํ๋ค.
์ ๋ ฅ ๋ฆฌ์คํธ์ ์ฐ์์ ์ธ ๋ถ๋ถ๋ฆฌ์คํธ๋ฅผ ๋ชจ๋ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ์์ฑํ๋ค๊ณ ํ์. ํ์ํ ๋ถ๋ถ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ํ์ค ์ปฌ๋ ์ ์ ๋ด๋ ์ฝ๋๋ 3์ค์ด๋ฉด ๋์ง๋ง, ์ด ์ปฌ๋ ์ ์ ์ ๋ ฅ ๋ฆฌ์คํธ ํฌ๊ธฐ์ ๊ฑฐ๋ญ์ ๊ณฑ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๋ค. ๋ฉฑ์งํฉ ๋์ฒ๋ผ ์ ์ฉ ์ปฌ๋ ์ ์ ๊ตฌํํ๊ธฐ๋ ์ง๋ฃจํ ์ผ์ด๋ค. ํนํ ์๋ฐ๋ ์ด๋ด ๋ ์ธ๋งํ ๊ณจ๊ฒฉ Iterator๋ฅผ ์ ๊ณตํ์ง ์๋๋ค.
ํ์ง๋ง ์ ๋ ฅ ๋ฆฌ์คํธ์ ๋ชจ๋ ๋ถ๋ถ๋ฆฌ์คํธ๋ฅผ ์คํธ๋ฆผ์ผ๋ก ๊ตฌํํ๊ธฐ๋ ์ด๋ ต์ง ์๋ค. ์ฒซ ๋ฒ์งธ ์์๋ฅผ ํฌํจํ๋ ๋ถ๋ถ๋ฆฌ์คํธ๋ฅผ ๊ทธ ๋ฆฌ์คํธ์ ํ๋ฆฌํฝ์ค๋ผ ํด๋ณด์ (์: {a,b,c}์ ํ๋ฆฌํ์ค๋ {a}, {a, b}, {a,b,c}). ๊ฐ์ ์์ผ๋ก ๋ง์ง๋ง ์์๋ฅผ ํฌํจํ๋ ๋ถ๋ถ๋ฆฌ์คํธ๋ฅผ ๊ทธ ๋ฆฌ์คํธ์ ์ํฝ์ค๋ผ๊ณ ํ์(์: {a,b,c}์ ์ํฝ์ค๋ {a,b,c}, {b,c}, {c}). ์ด์ ์ด๋ค ๋ฆฌ์คํธ์ ๋ถ๋ถ๋ฆฌ์คํธ๋ ๋จ์ํ ๊ทธ ๋ฆฌ์คํธ์ ํ๋ฆฌํฝ์ค์ ์ํ์ค์ ๋น ๋ฆฌ์คํธ ํ๋๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.
Stream.concat ๋ฉ์๋๋ ๋ฐํ๋๋ ์คํธ๋ฆผ์ ๋น ๋ฆฌ์คํธ๋ฅผ ์ถ๊ฐํ๋ฉฐ, flatMap ๋ฉ๋๋(์์ดํ 45)๋ ๋ชจ๋ ํ๋ฆฌํฝ์ค์ ๋ชจ๋ ์ํฝ์ค๋ก ๊ตฌ์ฑ๋ ํ๋์ ์คํธ๋ฆผ์ ๋ง๋ ๋ค. ๋ง์ง๋ง์ผ๋ก ํ๋ฆฌํฝ์ค๋ค๊ณผ ์ํฝ์ค๋ค์ ์คํธ๋ฆผ์ IntStream.range์ IntStream.rangeClose๊ฐ ๋ฐํํ๋ ์ฐ์๋ ์ ์๊ฐ๋ค์ ๋งคํํด ๋ง๋ ๋ค.
์์ดํ
48. ์คํธ๋ฆผ ๋ณ๋ ฌํ๋ ์ฃผ์ํด์ ์ ์ฉํ๋ผ
ํต์ฌ ์ ๋ฆฌ
ยท ๊ณ์ฐ๋ ์ฌ๋ฐ๋ก ์ํํ๊ณ ์ฑ๋ฅ๋ ๋นจ๋ผ์ง ๊ฑฐ๋ผ๋ ํ์ ์์ด๋ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ ๋ณ๋ ฌํ๋ ์๋์กฐ์ฐจ ํ์ง ๋ง๋ผ
ยท ์คํธ๋ฆผ์ ์๋ชป ๋ณ๋ ฌํํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ค๋์ํ๊ฒ ํ๊ฑฐ๋ ์ฑ๋ฅ์ ๊ธ๊ฒฉํ ๋จ์ด๋จ๋ฆฐ๋ค.
ยท ๋ณ๋ ฌํํ๋ ํธ์ด ๋ซ๋ค๊ณ ๋ฏฟ๋๋ผ๋, ์์ ํ์ ์ฝ๋๊ฐ ์ฌ์ ํ ์ ํํ์ง ํ์ธํ๊ณ ์ด์ ํ๊ฒฝ๊ณผ ์ ์ฌํ ์กฐ๊ฑด์์ ์ํํด๋ณด๋ฉฐ ์ฑ๋ฅ์งํ๋ฅผ ์ ์ฌํ ๊ด์ฐฐ ํ์. ๊ณ์ฐ๋ ์ ํํ๊ณ ์ฑ๋ฅ๋ ์ข์์ก์์ด ํ์คํด์ก์ ๋๋ง ๋ณ๋ ฌํ ๋ฒ์ ์ฝ๋๋ฅผ ์ด์ ์ฝ๋์ ๋ฐ์ํ์.
์๋ฐ์ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ
์ฃผ๋ฅ ์ธ์ด ์ค, ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ์ธก๋ฉด์์ ์๋ฐ๋ ํญ์ ์์๊ฐ๋ค.
ยท ์ฒ์ ๋ฆด๋ฆฌ์ค๋ 1996๋ ๋ถํฐ ์ค๋ ๋, ๋๊ธฐํ, wait/notify๋ฅผ ์ง์ํ๋ค.
ยท ์๋ฐ 5๋ถํฐ ๋์์ฑ ์ปฌ๋ ์ ์ java.util.concurrent ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์คํ์(Executor) ํ๋ ์์ํฌ๋ฅผ ์ง์ํ๋ค.
ยท ์๋ฐ 7๋ถํฐ ๊ณ ์ฑ๋ฅ ๋ณ๋ ฌ ๋ถํด(parallel decom-position) ํ๋ ์์ํฌ์ธ ํฌํฌ-์กฐ์ธ(fork-join) ํจํค์ง๋ฅผ ์ถ๊ฐํ๋ค.
ยท ์๋ฐ 8๋ถํฐ๋ parallel ๋ฉ์๋๋ง ํ ๋ฒ ํธ์ถํ๋ฉด ํ์ดํ๋ผ์ธ์ ๋ณ๋ ฌ ์คํํ ์ ์๋ ์คํธ๋ฆผ์ ์ง์ํ๋ค.
ยท ์๋ฐ๋ก ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์์ฑํ๊ธฐ๊ฐ ์ ์ ์ฌ์์ง๊ณ ์์ง๋ง, ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ณ ๋น ๋ฅด๊ฒ ์์ฑํ๋ ์ผ์ ์ฌ์ ํ ์ด๋ ค์ด ์์ ์ด๋ค.
์คํธ๋ฆผ ํ์ดํ๋ผ์ธ ๋ณ๋ ฌํ์ ์๋ชป๋ ์ฌ์ฉ
ยท ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋๋ ์์ ์ฑ๊ณผ ์๋ต ๊ฐ๋ฅ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ ์จ์ผ ํ๋๋ฐ, ๋ณ๋ ฌ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ค๋ฅผ ๋ฐ ์๋ค.
์์ดํ 45์ ๋ฉ๋ฅด์ผ ์์๋ฅผ ์์ฑํ๋ ํ๋ก๊ทธ๋จ์ ๋ค์ ์ดํด๋ณด์
๋ค์ ์ฝ๋๋ฅผ ์คํํ๋ 7์ด๊ฐ ๊ฑธ๋ ธ๋ค.
์๋๋ฅผ ๋์ด๊ธฐ ์ํด ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ parallel()์ ํธ์ถํ๊ฒ ๋ค๋ ์์งํ ์๊ฐ์ ํ๋ค๊ณ ๊ฐ์ ํ์.
์์๊ณผ๋ ๋ค๋ฅด๊ฒ ์ ์ฝ๋๋ ์๋ฌด๊ฒ๋ ์ถ๋ ฅํ์ง ๋ชปํ๋ฉด์ CPU๋ 90%๋ ์ก์๋จน๋ ์ํ๊ฐ ๋ฌดํํ ๊ณ์๋๋ค(์๋ต ๋ถ๊ฐ: liveness failure).
- ์์ธ: ์คํธ๋ฆผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ด ํ์ดํ๋ผ์ธ์ ๋ณ๋ ฌํํ๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ด์ง ๋ชปํ์ง ๋๋ฌธ์ด๋ค.
ยท ํ๊ฒฝ์ด ์๋ฌด๋ฆฌ ์ข๋๋ผ๋ ๋ฐ์ดํฐ ์์ค๊ฐ Steam.iterate๊ฑฐ๋ ์ค๊ฐ ์ฐ์ฐ์ผ๋ก limit์ ์ฐ๋ฉด ํ์ดํ๋ผ์ธ ๋ณ๋ ฌํ๋ก ์ฑ๋ฅ ๊ฐ์ ์ ๊ธฐ๋ํ ์ ์๋ค.
์ ์ฝ๋๋ ๋ ๋ฌธ์ ๋ฅผ ๋ชจ๋ ์ง๋๊ณ ์๋ค. ๋ํ ํ์ดํ๋ผ์ธ ๋ณ๋ ฌํ๋ limit์ ๋ค๋ฃฐ ๋ CPU ์ฝ์ด๊ฐ ๋จ๋๋ค๋ฉด ์์๋ฅผ ๋ช ๊ฐ ๋ ์ฒ๋ฆฌํ ํ ์ ํ๋ ๊ฐ์ ์ดํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฒ๋ ค๋ ์๋ฌด๋ฐ ํด๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด ์ฝ๋์ ๊ฒฝ์ฐ ์๋กญ๊ฒ ๋ฉ๋ฅด์ผ ์์๋ฅผ ์ฐพ์ ๋๋ง๋ค ๊ทธ ์ ์์๋ฅผ ์ฐพ์ ๋๋ณด๋ค ๋ ๋ฐฐ ์ ๋ ๋ ์ค๋ ๊ฑธ๋ฆฐ๋ค. ์ฆ, ์์ ํ๋๋ฅผ ๊ณ์ฐํ๋ ๋น์ฉ์ด ๋๋ ๊ทธ ์ด์ ๊น์ง์ ์์ ์ ๋ถ๋ฅผ ๊ณ์ฐํ ๋น์ฉ์ ํฉ์น ๊ฒ๋งํผ ๋ ๋ค๋ ๋ป์ด๋ค. ๊ทธ๋์ ์ ์ฝ๋์ ํ์ดํ๋ผ์ธ์ ์๋ ๋ณ๋ ฌํ ์๊ณ ๋ฆฌ์ฆ์ด ์ ๊ธฐ๋ฅ์ ๋ชปํ๊ฒ ๋ง๋น์ํจ๋ค.
ยท ๊ตํ: ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ๋ง๊ตฌ์ก์ด๋ก ๋ณ๋ ฌํํ๋ฉด ์ ๋๋ค. ์ฑ๋ฅ์ด ์คํ๋ ค ๋์ฐํ๊ฒ ๋๋น ์ง ์ ์๋ค.
์คํธ๋ฆผ ํ์ดํ๋ผ์ธ ๋ณ๋ ฌํ์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ
ยท ๋์ฒด๋ก ์คํธ๋ฆผ ์์ค๊ฐ ArrayList, HashMap, HashSet, ConcurrentHashMap์ ์ธ์คํด์ค๊ฑฐ๋ ๋ฐฐ์ด, int ๋ฒ์, long ๋ฒ์์ผ ๋ ๋ณ๋ ฌํ์ ํจ๊ณผ๊ฐ ๊ฐ์ฅ ์ข๋ค.
- ์ด ์๋ฃ๊ตฌ์กฐ๋ค์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ํฌ๊ธฐ๋ก ์ ํํ๊ณ ์์ฝ๊ฒ ๋๋ ์ ์์ด์ ์ผ์ ๋ค์์ ์ค๋ ๋์ ๋ถ๋ฐฐํ๊ธฐ์ ์ข๋ค.
- ๋๋๋ ์์ ์ Spliterator๊ฐ ๋ด๋นํ๊ณ , Spliterator ๊ฐ์ฒด๋ Stream์ด๋ Iterable์ spliterator ๋ฉ์๋๋ก ์ป์ด์ฌ ์ ์๋ค.
ยท ์ด ์๋ฃ๊ตฌ์กฐ๋ค์ ๋ชจ๋ ์์๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํํ ๋์ ์ฐธ์กฐ ์ง์ญ์ฑ(locality of reference)์ด ๋ฐ์ด๋๋ค.
- ์ด์ํ ์์์ ์ฐธ์กฐ๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ํ์ฌ ์ ์ฅ๋์ด ์๋ค๋ ๋ป์ด๋ค.
- ์ฐธ์กฐ๋ค์ด ๊ฐ๋ฆฌํค๋ ์ค์ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์๋ก ๋จ์ด์ ธ ์์ ์ ์๋๋ฐ, ๊ทธ๋ฌ๋ฉด ์ฐธ์กฐ ์ง์ญ์ฑ์ด ๋๋น ์ง๋ค.
- ์ฐธ์กฐ ์ง์ญ์ฑ์ด ๋ฎ์ผ๋ฉด ์ค๋ ๋๋ ๋ฐ์ดํฐ๊ฐ ์ฃผ ๋ฉ๋ชจ๋ฆฌ์์ ์บ์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ ์ก๋์ด ์ค๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ ์๊ฐ์ ๋ฉํ๋ ๋ณด๋ธ๋ค.
- ๋ฐ๋ผ์ ์ฐธ์กฐ ์ง์ญ์ฑ์ ๋ค๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฒํฌ ์ฐ์ฐ์ ๋ณ๋ ฌํํ ๋ ์์ฃผ ์ค์ํ ์์๋ค.
- ์ฐธ์กฐ ์ง์ญ์ฑ์ด ๊ฐ์ฅ ๋ฐ์ด๋ ์๋ฃ๊ตฌ์กฐ๋ ๊ธฐ๋ณธ ํ์ ์ ๋ฐฐ์ด์ด๋ค. ๊ธฐ๋ณธ ํ์ ๋ฐฐ์ด์๋ ๋ฐ์ดํฐ ์์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ํด์ ์ ์ฅ๋๋ค.
ยท ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ์ ์ข ๋จ ์ฐ์ฐ์ ๋์ ๋ฐฉ์๋ ๋ณ๋ ฌ ์ํ ํจ์จ์ ์ํฅ์ ์ค๋ค.
- ์ข ๋จ ์ฐ์ฐ์์ ์ํํ๋ ์์ ๋์ด ํ์ดํ๋ผ์ธ ์ ์ฒด ์์ ์์ ์๋น ๋น์ค์ ์ฐจ์งํ๋ฉด์ ์์ฐจ์ ์ธ ์ฐ์ฐ์ด๋ฉด, ํ์ดํ๋ผ์ธ ๋ณ๋ ฌ ์ํ์ ํจ๊ณผ๋ ์ ํ๋๋ค.
- ๋ณ๋ ฌํ์ ์ ํฉํ ์ข ๋จ ์ฐ์ฐ: ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ์ถ์(reduction)์ด๋ค. ์ถ์๋ reduce ๋ฉ์๋ ์ค ํ๋ ๋๋, min, max, count, sum ๊ฐ์ด ์์ฑ๋ ํํ๋ก ์ ๊ณต๋๋ ๋ฉ์๋ ์ค ํ๋๋ฅผ ์ ํํด ์ํํ๋ค. any, allMatch, noneMatch ์ฒ๋ผ ์กฐ๊ฑด์ ๋ง์ผ๋ฉด ๋ฐ๋ก ๋ฐํ๋๋ ๋ฉ์๋๋ ๋ณ๋ ฌํ์ ์ ํฉํ๋ค.
- ๋ณ๋ ฌํ์ ๋ถ์ ํฉํ ์ข ๋จ ์ฐ์ฐ: ๊ฐ๋ณ ์ถ์๋ฅผ ์ํํ๋ Stream์ collect ๋ฉ์๋๋ ๋ณ๋ ฌํ์ ์ ํฉํ์ง ์๋ค. ์ปฌ๋ ์ ๋ค์ ํฉ์น๋ ๋ถ๋ด์ด ํฌ๊ธฐ ๋๋ฌธ์ด๋ค.
ยท ์ง์ ๊ตฌํํ Stream, Iterable, Collection์ด ๋ณ๋ ฌํ์ ์ด์ ์ ์ ๋๋ก ๋๋ฆฌ๊ฒ ํ๋ ค๋ฉด, Spliterator ๋ฉ์๋๋ฅผ ๋ฐ๋์ ์ฌ์ ์ํ๊ณ ๊ฒฐ๊ณผ ์คํธ๋ฆผ์ ๋ณ๋ ฌํ ์ฑ๋ฅ์ ๊ฐ๋ ๋๊ฒ ํ ์คํธํ๋ผ.
- ๊ณ ํจ์จ spliterator๋ฅผ ์์ฑํ๊ธฐ๋ ์๋นํ ๋์ด๋์ ์ผ์ด๊ณ , ์ด ์ฑ ์์๋ ๋ค๋ฃจ์ง ์๋๋ค.
ยท ์คํธ๋ฆผ์ ์๋ชป ๋ณ๋ ฌํํ๋ฉด (์๋ต ๋ถ๊ฐ ๋ฑ) ์ฑ๋ฅ์ด ๋๋น ์ง ๋ฟ๋ง ์๋๋ผ, ๊ฒฐ๊ณผ ์์ฒด๊ฐ ์๋ชป๋๊ฑฐ๋ ์์ ๋ชปํ ๋์์ด ๋ฐ์ํ ์ ์๋ค.
- ๊ฒฐ๊ณผ๊ฐ ์๋ชป๋๊ฑฐ๋ ์ค์๋ํ๋ ๊ฒ์ ์์ ์คํจ(safety failure)๋ผ ํ๋ค.
- ์์ ์คํจ๋ ๋ณ๋ ฌํํ ํ์ดํ๋ผ์ธ์ด ์ฌ์ฉํ๋ mappers, filters, ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ๊ณตํ ๋ค๋ฅธ ํจ์ ๊ฐ์ฒด๊ฐ ๋งน์ธ๋๋ก ๋์ํ์ง ์์ ๋ ๋ฒ์ด์ง ์ ์๋ค.
- Stream ๋ช ์ธ๋ ์ด๋ ์ฌ์ฉ๋๋ ํจ์ ๊ฐ์ฒด์ ๊ดํ ์์คํ ๊ท์ฝ์ ์ ์ํด๋จ๋ค.
ex) Stream์ reduce ์ฐ์ฐ์ ๊ฑด๋ค์ง๋ accumulator(๋์ ๊ธฐ)์ combiner(๊ฒฐํฉ๊ธฐ) ํจ์๋ ๋ฐ๋์ ๊ฒฐํฉ๋ฒ์น์ ๋ง์กฑํ๊ณ , ๊ฐ์ญ๋ฐ์ง ์๊ณ , ์ํ๋ฅผ ๊ฐ์ง ์์์ผ ํ๋ค.
- ์ ์๊ตฌ์ฌํญ์ ์งํค์ง ๋ชปํด๋ ํ์ดํ๋ผ์ธ์ ์์ฐจ์ ์ผ๋ก ์ํํ๋ค๋ฉด ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค. ํ์ง๋ง ๋ณ๋ ฌ๋ก ์ํํ๋ฉด ์คํจ๋ก ์ด์ด์ง๊ธฐ ์ฝ๋ค.
- ์์ ๋ณ๋ ฌํํ ๋ฉ๋ฅด์ผ ์์ ํ๋ก๊ทธ๋จ์ ์๋ฃ๋๋๋ผ๋ ์ถ๋ ฅ๋ ์์์ ์์๊ฐ ์ฌ๋ฐ๋ฅด์ง ์์ ์ ์๋ค. ์ถ๋ ฅ ์์๋ฅผ ์์ฐจ ๋ฒ์ ์ฒ๋ผ ์ ๋ ฌํ๊ณ ์ถ๋ค๋ฉด ์ข ๋จ ์ฐ์ฐ forEach๋ฅผ forEachOrdered๋ก ๋ฐ๊ฟ์. ์ด ์ฐ์ฐ์ ๋ณ๋ ฌ ์คํธ๋ฆผ๋ค์ ์ํํ๋ฉฐ ์์๋ฅผ ๋ฐ๊ฒฌํ ์์๋๋ก ์ถ๋ ฅ๋๋๋ก ๋ณด์ฅํด์ค ๊ฒ์ด๋ค.
ยท ๋ฐ์ดํฐ ์์ค ์คํธ๋ฆผ์ด ํจ์จ์ ์ผ๋ก ๋๋ ์ง๊ณ , ๋ณ๋ ฌํํ๊ฑฐ๋ ๋นจ๋ฆฌ ๋๋๋ ์ข ๋จ ์ฐ์ฐ์ ์ฌ์ฉํ๊ณ , ํจ์ ๊ฐ์ฒด๋ค๋ ๊ฐ์ญํ์ง ์๋๋ผ๋, ํ์ดํ๋ผ์ธ์ด ์ํํ๋ ์ง์ง ์์ ์ด ๋ณ๋ ฌํ์ ๋๋ ์ถ๊ฐ ๋น์ฉ์ ์์ํ์ง ๋ชปํ๋ฉด, ์ฑ๋ฅ ํฅ์์ ๋ฏธ๋ฏธํ ์ ์๋ค.
- ์ฑ๋ฅ์ด ํฅ์๋ ์ง ์ถ์ ํด๋ณด๋ ๋ฐฉ๋ฒ: ์คํธ๋ฆผ ์์ ์์ ์์ ์์๋น ์ํ๋๋ ์ฝ๋ ์ค ์๋ฅผ ๊ณฑํ๋ค. ์ด ๊ฐ์ด ์ต์ ์์ญ๋ง์ ๋์ด์ผ ์ฑ๋ฅ ํฅ์์ ๋ง๋ณผ ์ ์๋ค.
ยท ์คํธ๋ฆผ ๋ณ๋ ฌํ๋ ์ค์ง ์ฑ๋ฅ ์ต์ ํ ์๋จ์ด๋ฏ๋ก, ๋ณ๊ฒฝ ์ ํ๋ก ๋ฐ๋์ ์ฑ๋ฅ์ ํ ์คํธํ์ฌ ์ฌ์ฉํ ๊ฐ์น๊ฐ ์๋์ง ํ์ธํด์ผ ํ๋ค(์์ดํ 67).
- ์ด์์ ์ผ๋ก๋ ์ด์ ์์คํ ๊ณผ ํก์ฌํ ํ๊ฒฝ์์ ํ ์คํธํ๋ ๊ฒ์ด ์ข๋ค.
- ๋ณดํต์ ๋ณ๋ ฌ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ๋ ๊ณตํต์ ํฌํฌ-์กฐ์ธ ํ์์ ์ํ๋๋ฏ๋ก(์ฆ, ๊ฐ์ ์ค๋ ๋ ํ์ ์ฌ์ฉ), ์๋ชป๋ ํ์ดํ๋ผ์ธ ํ๋๊ฐ ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ฑ๋ฅ๊น์ง ์ ์ํฅ์ ์ค ์ ์๋ค.
์คํธ๋ฆผ ํ์ดํ๋ผ์ธ ๋ณ๋ ฌํ์ ํจ๊ณผ๊ฐ ์ ๋๋ก ๋ฐํ๋๋ ์
ยท ์กฐ๊ฑด์ด ์ ๊ฐ์ถฐ์ง๋ฉด parallel ๋ฉ์๋ ํธ์ถฃ ํ๋๋ก ๊ฑฐ์ ํ๋ก์ธ์ ์ฝ์ด ์์ ๋น๋กํ๋ ์ฑ๋ฅ ํฅ์์ ๋ง๋ฝํ ์ ์๋ค.
๋ค์์ ์คํธ๋ฆผ ํ์ดํ๋ผ์ธ ๋ณ๋ ฌํ๊ฐ ํจ๊ณผ๋ฅผ ์ ๋๋ก ๋ฐํํ๋ ์๋ค. n๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์์ ๊ฐ์๋ฅผ ๊ณ์ฐํ๋ค.
๋ค์์ ์ ํ๋ก๊ทธ๋จ์ ๋ณ๋ ฌํ ๋ฒ์ ์ผ๋ก ๋ณ๊ฒฝํ ๊ฒ์ด๋ค. parallel() ํธ์ถ ํ๋๋ฅผ ์ถ๊ฐํ ๊ฒ๋ง์ผ๋ก ์์ ์๊ฐ์ด ์๋นํ ๊ฐ์ํ๋ค.
๋ฌด์์ ์์ ๋ณ๋ ฌํ: SplittableRandom vs ThreadRandom vs Random
ยท ๋ฌด์์ ์๋ค๋ก ์ด๋ค์ง ์คํธ๋ฆผ์ ๋ณ๋ ฌํํ๋ ค๋ฉด ThreadLocalRandom(๋๋ Random)๋ณด๋ค๋ SplittableRandom ์ธ์คํด์ค๋ฅผ ์ด์ฉํ์.
- ํด๋น ํด๋์ค๋ ์ ํํ ์ด๋ด ๋ ์ฐ๊ณ ์ ์ค๊ณ๋ ๊ฒ์ด๋ผ ๋ณ๋ ฌํํ๋ฉด ์ฑ๋ฅ์ด ์ ํ์ผ๋ก ์ฆ๊ฐํ๋ค.
ยท ThreadRandom์ ๋จ์ผ ์ค๋ ๋์์ ์ฐ๊ณ ์ ๋ง๋ค์ด์ก๋ค.
- ๋ณ๋ ฌ ์คํธ๋ฆผ์ฉ ๋ฐ์ดํฐ ์์ค๋ก๋ ์ฌ์ฉํ ์ ์์ง๋ง, SplittableRandom๋งํผ ๋น ๋ฅด์ง๋ ์๋ค.
ยท Random์ ๋ชจ๋ ์ฐ์ฐ์ ๋๊ธฐํํ๋ฏ๋ก, ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋ฉด ์ต์ ์ ์ฑ๋ฅ์ ๋ณด์ธ๋ค.
Last updated