(์งํผํฐ ์ ์๋์) ๋๋ค์ ์ผ๊ธ ๊ฐ์ฒด, FP ํน๊ฐ
๐ฑ ๋ง๋ฐฅ: ๋๋ค์ ์ผ๊ธ ๊ฐ์ฒด
๋๋ค๋ฅผ ์ด๋ ๊ฒ ์๊ฐํด๋ด. ‘์ฝ๋๋ฅผ ๋ฐ๋ก ์์ ๋ค๊ณ ์ธ ์ ์๋ ์์ ์กฐ๊ฐ’ ๊ฐ์ ๊ฑฐ์ผ. ํ ๋ฒ, ์ด๋ฐ ์์์ ํด๋ณด์:
๐ณ ์๋ฆฌ์ฌ ์ด์ผ๊ธฐ
์๋ฆฌ์ฌ๊ฐ ์๋๋ฐ, ์ด ์ฌ๋์ ํน๋ณํ ๋ ์ํผ ์์ด๋ ์์์ ๋ง๋ค ์ ์๋ ๋๋จํ ์ค๋ ฅ์์ผ. "์ด ์ฌ๋ฃ๋ก ์ด๋ ๊ฒ ํด์ค!"๋ผ๊ณ ๋ง ๋งํ๋ฉด ๋ฐ๋ก ์๋ฆฌ๋ฅผ ์์ํ์ง. ์ด๊ฒ ๋ฐ๋ก ๋๋ค์ผ. **ํ์ํ ์ฌ๋ฃ(์ธ์)**๋ฅผ ์ฃผ๊ณ , **์ด๋ป๊ฒ ์๋ฆฌํ ์ง(๋์)**๋ฅผ ๊ฐ๋จํ ์ ์ํ๋ฉด ๋.
๋๋ค๋ฅผ ์ฐ๋ฉด ๊ธด ๋ ์ํผ(ํจ์ ์ ์)๋ฅผ ์๋ตํ๊ณ , ์งง๊ณ ๊ท์ฌ์ด ํ ์ค๋ก '์์ ์ง์์'๋ฅผ ์ ์ ์ ์๋ ๊ฒ์ด์ง!
๐ฉ ์ผ๊ธ ๊ฐ์ฒด๋?
์ด์ ๋ฌด๋๋ก ๋์ด๊ฐ ๋ณด์. ์ผ๊ธ ๊ฐ์ฒด๋ VIP!
์ด VIP๋ ๋ค๋ฅธ '์ผ๋ฐ์ ์ธ ๊ฐ'์ฒ๋ผ ๋ ์ ์๋ ์์ฃผ ๋ฉ์ง ์๊ฒฉ์ ๊ฐ์ง ์กด์ฌ์ผ. ์๋ฅผ ๋ค์ด ํจ์๋ ๋๋ค๋ฅผ ๋ง์ด์ง.
- VIP์ ์๊ฒฉ์ฆ:
- ๋ณ์์ ๋ด์ ์ ์์ด! (let myFunction = function() { ... };)
- ๋ค๋ฅธ ํจ์์ ์ฌ๋ฃ๋ก ์ค ์ ์์ด! (doSomething(myFunction))
- ํจ์์์ ์๋ก ๋ง๋ค์ด์ ๋๋ ค์ค ์๋ ์์ด! (return function() { ... };)
๊ฒฐ๋ก ์ ์ผ๋ก, ‘ํจ์’๋ฅผ ๋ง์น ์ซ์๋ ๋ฌธ์์ด์ฒ๋ผ ์์ ๋กญ๊ฒ ๋ค๋ฃฐ ์ ์๋ค๋ ๊ฒ ์ผ๊ธ ๊ฐ์ฒด์ ํต์ฌ์ด์ผ.
๋๋ค์ ์ผ๊ธ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋๋ฐ์์ ์ ์ฐํจ๊ณผ ์ฌ์ฌ์ฉ์ฑ์ ๊ทน๋ํ์์ผ์ค.
ํจ์๋ฅผ ๋ฐ์ดํฐ์ฒ๋ผ ๋ค๋ฃฐ ์ ์์ผ๋ฉด ์ถ์ํ์ ๋ชจ๋ํ๊ฐ ์ฌ์์ง๊ณ , ๋๋ค๋ฅผ ์ฐ๋ฉด ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ ธ์ ๊ฐ๋
์ฑ๋ ์ข์์ง์ง!
๊ฒฐ๋ก : ๋๋ค์ ์ผ๊ธ ๊ฐ์ฒด๋ ์๋ฆฌ์ฌ์๊ฒ '์ฌ๋ฃ์ ๋๊ตฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์จ์ ์ต๊ณ ์๋ฆฌ๋ฅผ ๋ง๋ค์ด์ฃผ๋ ๋น๋ฒ'๊ณผ ๊ฐ์! ๐
์ ์ค์ํ ๊น?
์ผ๊ธ ๊ฐ์ฒด๊ฐ ๋๋ฉด ํ๋ก๊ทธ๋จ์์ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ๋์์ด ๊ฐ๋ฅํด์ ธ! ์๋ฅผ ๋ค์ด:
- ๊ณ ์ฐจ ํจ์: ํจ์๋ฅผ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋ ๋ฐํํ๋ ๊ฑธ ์ฝ๊ฒ ํ ์ ์์ด.
- ์ฝ๋ฐฑ ํจํด: ํน์ ๋์์ ์คํํ๋ ํจ์๋ค์ ์ํ๋ ๋๋ก ๋ฐ๊ฟ ๋ผ์ธ ์ ์์ด.
- ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ฐ๋ ์ฑ: ์์ ๋จ์๋ก ์ชผ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ ์ง๋ณด์๋ ์ฌ์์ง๊ณ , ์ฌ์ฌ์ฉ๋ ๊ฐ๋จํด์ ธ.
๐ฉ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ(FP)๊ณผ์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ!
๋๋ค์ ์ผ๊ธ ๊ฐ์ฒด๋ **ํจ์ํ ํ๋ก๊ทธ๋๋ฐ(Functional Programming)**์์ ์์ฃผ ์ค์ํ ์ญํ ์ ํด.
"FP๊ฐ ๋ญ๋?"๊ณ ๋ฌป๋๋ค๋ฉด ์ด๋ ๊ฒ ์ค๋ช
ํ ๊ฒ:
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ง์น ๋ ๊ณ ๋ธ๋ก์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ์กฐ๋ฆฝํ๋ ๊ฒ์ฒ๋ผ ์๊ฐํ๋ฉด ๋ผ.
- ๊ฐ ๋ธ๋ก(ํจ์)์ ๋ ๋ฆฝ์ ์ด๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํด์ผ ํ๊ณ , ๋ด๊ฐ ์ํ๋ ๋๋ก ์ฐ๊ฒฐํด์ ๊ฑฐ๋ํ ๊ตฌ์กฐ๋ฌผ์ ๋ง๋ค ์ ์์ด.
- ๊ทธ๋ฐ๋ฐ, ์ด๋ฐ ๋ธ๋ก์ด ๊นจ๋ํ๊ณ ํผํผํด์ผ ํ๊ฒ ์ง? ๊ทธ๋์ FP๋ ๋ค์ ๋ ๊ฐ์ง๋ฅผ ํต์ฌ์ผ๋ก ์ผ์:
- ์์์ฑ(Purity): ๋ธ๋ก ์์์ ๋๊ณ ๋๋ฉด ์ฃผ๋ณ์ ํ์ ์ ๋จ๊ธฐ์ง ์์์ผ ํด. (Side-effect๋ฅผ ํผํ์!)
- ๋ถ๋ณ์ฑ(Immutability): "์๋ ์๋ ๊ฑด ์๋์ง ๋ง๊ณ ์ ๊ฑฐ๋ฅผ ๋ง๋ค์ด์ ์ค!"๋ผ๋ ์ฒ ํ์ ์ค์์ํด.
FP๋ฅผ ์ ์ข์ํ ๊น?
- ๋ฒ๊ทธ๋ฅผ ์ค์ธ๋ค
- ์ธ๋ถ ์ํ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์ผ๋, ์์์น ๋ชปํ ๋์์ด ์ค์ด๋ค์ด.
- ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ๊ฐํ๋ค
- ๋ถ๋ณ์ฑ์ด ๋ณด์ฅ๋๋ ์ฌ๋ฌ ์์ ์ ๋์์ ๋๋ ค๋ ๋ฐ์ดํฐ ์ถฉ๋ ๊ฑฑ์ ์์!
- ์ฌ์ฌ์ฉ์ฑ ๋ฐ ๊ฐ๋
์ฑ
- ์๊ณ ๋จ์ํ ํจ์๋ค์ด ์กฐ๋ฆฝ ๋ธ๋ก์ฒ๋ผ ์์ด๋๊น ์ฝ๋๊ฐ ์ฝ๊ธฐ ์ฝ๊ณ ์ฌํ์ฉ ๊ฐ๋ฅํด.
๐ฑ ๋ค์ '๋ง๋ฐฅ'์ผ๋ก ๋์์: FP์ ์ฌ๋ฏธ์๋ ์
๐ณ ์๋ง์ ์๋ค ์ด์ผ๊ธฐ
์๋ง๊ฐ ์๋ค์๊ฒ ์ฌ๋ถ๋ฆ์ ์์ผ.
“๊ฐ์ ์ฌ๊ณผ ์ฌ ์!”
๊ทธ๋ฐ๋ฐ ์๋ค์ ๋ง์ ์ ๋ค์ด๋ ์ง์ ์ฌ๊ณผ๋ง ๋จ๊ฒจ๋๊ณ , ์ฌ๋ถ๋ฆ ๊ธฐ๋ก์ ๊นจ๋ํ๊ฒ ์ง์๋.
์๋ค์ ํ๋์ FP ๋ฐฉ์๊ณผ ๋ฎ์์ด. ์๋๋ฉด:
- ์ฌ๊ณผ๋ง ์ฌ๊ณ , ๊ทธ ์ธ์ ์ก์ผ์ ์ ๋ ์ ํด! (์์ ํจ์)
- ์๋ ์ง์ ์๋ ๊ฒ๋ค์ ๊ฑด๋๋ฆฌ์ง ์๊ณ , ์ฌ๊ณผ๋ ๋ณ๋๋ก ๋ฌ! (๋ถ๋ณ์ฑ)
์ด๊ฒ ๋ฐ๋ก ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ์ถ๊ตฌํ๋ ์ฒ ํ์ด์ง.
๐ ๋ค ์ ๋ฆฌํ ๋ด์ฉ์ ํ๋ฆ
- ์ผ๊ธ ๊ฐ์ฒด
- "ํจ์๋ฅผ ๋ฐ์ดํฐ์ฒ๋ผ ๊ฐ๋ค ์ฐ๊ฑฐ๋ ๋ฆฌํดํ ์ ์๋ ๊ฒ."
→ ์์ ๋ง์.
์๋ฐ๋ ํจ์๊ฐ ์ผ๊ธ ๊ฐ์ฒด๋ ์๋์ง๋ง, ๋๋ค์ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ผ๊ธ ๊ฐ์ฒด์ฒ๋ผ ์ธ ์ ์๊ฒ ํด์ค.
- "ํจ์๋ฅผ ๋ฐ์ดํฐ์ฒ๋ผ ๊ฐ๋ค ์ฐ๊ฑฐ๋ ๋ฆฌํดํ ์ ์๋ ๊ฒ."
- ๋๋ค
- "์๋ฐ์์ ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด์ฒ๋ผ ์ธ ์ ์๋ ๋ฐฉ๋ฒ์ด๊ณ , ์์ฑํด์ผ ํ ํจ์๋ฅผ ์์ฝํด์ ํต์ฌ๋ง ๋ฑ ์ ์ด์ค๋ค."
→ ๋ฑ ๋ง์.
ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํด์ ๋๋ค๋ฅผ ๋ณ์์ฒ๋ผ ์ ๋ฌํ๊ฑฐ๋ ์งง์ ์ฝ๋๋ก ๋์ ์ ์ ๊ฐ๋ฅ.
- "์๋ฐ์์ ํจ์๋ฅผ ์ผ๊ธ ๊ฐ์ฒด์ฒ๋ผ ์ธ ์ ์๋ ๋ฐฉ๋ฒ์ด๊ณ , ์์ฑํด์ผ ํ ํจ์๋ฅผ ์์ฝํด์ ํต์ฌ๋ง ๋ฑ ์ ์ด์ค๋ค."
- FP(ํจ์ํ ํ๋ก๊ทธ๋๋ฐ)
- "ํจ์๋ฅผ ์กฐํฉํด์ ๋ญ ๋ง๋๋ ๊ฑด๋ฐ, ํต์ฌ์ ํจ์์ ์กฐํฉ."
→ ๋ง์!
FP๋ ์์ ํจ์๋ค์ ์กฐํฉํด ํฐ ๋์์ ๋ง๋๋ ๊ฑฐ๊ณ , ์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ ํจ์๊ฐ ์ผ๊ธ ๊ฐ์ฒด์ฒ๋ผ ์ฐ์ด๊ธฐ ๋๋ฌธ.
- "ํจ์๋ฅผ ์กฐํฉํด์ ๋ญ ๋ง๋๋ ๊ฑด๋ฐ, ํต์ฌ์ ํจ์์ ์กฐํฉ."
- ๊ฒฐ๋ก
- "FP์์ ์ค์ํ ๊ฑด ์ผ๊ธ ๊ฐ์ฒด๋ค. ํจ์์ ์กฐํฉ์ ํจ์๋ฅผ ๊ฐ๋ค ์ฐ๊ฑฐ๋ ๋ฆฌํดํ ์ ์์ด์ผ ๊ฐ๋ฅํ๋๊น."
→ ์๋ฒฝ!
FP์ ์ฒ ํ์ ํจ์ ์์ฒด๋ฅผ ๊ฐ์ฒ๋ผ ๋ค๋ฃจ๋ ๊ฒ์ ๊ธฐ๋ฐํ๊ณ , ๊ทธ๊ฒ ๋ฐ๋ก ์ผ๊ธ ๊ฐ์ฒด์ ๋๋ค ๋๋ถ์ ๊ฐ๋ฅ.
- "FP์์ ์ค์ํ ๊ฑด ์ผ๊ธ ๊ฐ์ฒด๋ค. ํจ์์ ์กฐํฉ์ ํจ์๋ฅผ ๊ฐ๋ค ์ฐ๊ฑฐ๋ ๋ฆฌํดํ ์ ์์ด์ผ ๊ฐ๋ฅํ๋๊น."
๐ก ์ถ๊ฐ๋ก ๊ธฐ์ตํ๋ฉด ์ข์ ์
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ณธ์ง:
ํจ์ ์กฐํฉ ์ธ์๋, ์์ ํจ์, ๋ถ๋ณ์ฑ๋ ์ค์!
๐ ์๋ฅผ ๋ค์ด, FP์์๋ ํจ์๊ฐ ์ธ๋ถ ์ํ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ ๋ ฅ๊ฐ๋ง์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด์ผ ํจ. - ๋๋ค์ ์คํธ๋ฆผ API์ ์กฐํฉ:
์๋ฐ์์ FP๋ฅผ ์คํํ๋ ค๋ฉด ๋๋ค์ ์คํธ๋ฆผ API๋ฅผ ๊ผญ ์์์ผ ํด. ์คํธ๋ฆผ์ ๋ฐ์ดํฐ๋ฅผ ํจ์ํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ๋์์ค.