230202(๋ชฉ)
๐ ์ฑ์ฅ์ผ์ง 3.1
์ฑ
ํ๋ณตํ ์ด๊ธฐ์ฃผ์์(์จ์ธ ๋ค์ด์ด)
์ ๋ด์ฉ์ ์๊ทน๋ฐ์ ์์ํ๋ ์๋ฐํ ์ฑ์ฅ๊ธฐ๋ก
์ด์์๋ ๊ฝ๊ณผ ์ฃฝ์ ๊ฝ์ ์ด๋ป๊ฒ ๊ตฌ๋ณํ๋๊ฐ?
์ฑ์ฅํ๊ณ ์๋ ๊ฒ์ด ์ด์ ์๋ ๊ฒ์ด๋ค.
์๋ช ์ ์ ์ผํ ์ฆ๊ฑฐ๋ ์ฑ์ฅ์ด๋ค!
๐ณ ํค์๋ (1.0)
์ต๋ํ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌ, ์ถํ์ ๋ณด๋ฉด์ ์ค์ค๋ก ์ค๋ช
๐ ๊ฒฝํ ์์ฃผ๋ก (2.0)
๋จ์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ธฐ๋ณด๋ค ๋ฌด์์ ๋ฐฐ์ ๊ณ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์งง๊ณ ๊ฐ๋จํ๊ฒ ์์ฑ
โ๏ธ ์ ํด์ง ํ ํ๋ฆฟ์ ๋ง์ถฐ์ (3.0)
ํค์๋, ๊ฒฝํ ๋ชจ๋ ์ข๋ค. ๋ค๋ง ๋งค์ผ ์์ฑํ๊ธฐ๋ก ๋ง์ ๋จน์๋งํผ ํต์ฌ๋ง ๊ฐ๊ฒฐํ๊ฒ ์ ๋ฆฌํ ์ ์๊ฒ ํ ํ๋ฆฟ์ ์์ฑ (3.1) 230102๋ถํฐ ์์๋๋ ํ์ต์ ๊ดํ ๋ด์ฉ ์ถ๊ฐ
๐ ์ค๋์ ํค์๋
ํจ์ ํฉ์ฑ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ์๊ฒ ๋๋์ด์ง ์์ํจ์๋ค์ ์กฐํฉํ๋ ๋ฐฉ๋ฒ
๊ณ ์ฐจํจ์
- ํจ์๋ฅผ ์ธ์๋ก ์ ๋ฌ๋ฐ๋ ํจ์
- ํจ์๋ฅผ ๋ฐํํ๋ ํจ์
- ์ธ์๋ก ๋ฐ์ ํจ์๋ฅผ ํ์ํ ์์ ์ ํธ์ถํ๊ฑฐ๋ ํด๋ก์ ๋ฅผ ์ด์ฉํ์ฌ ๋ฐํํ๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋
์ผ๊ธ ๊ฐ์ฒด
์ด๊ธฐ์ ๊ฐ๋ฅํ๋ค!
์ปค๋ง(Currying)
- ์ปค๋ง์ f(a, b, c)์ฒ๋ผ ๋จ์ผ ํธ์ถ๋ก ์ฒ๋ฆฌํ๋ ํจ์๋ฅผ f(a)(b)(c)์ ๊ฐ์ด ๊ฐ๊ฐ์ ์ธ์๊ฐ ํธ์ถ ๊ฐ๋ฅํ ํ๋ก์ธ์ค๋ก ํธ์ถ๋ ํ ๋ณํฉ๋๋๋ก ๋ณํํ๋ ๊ฒ
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํด์ผํ ๊ฐ์ด๋ ํจ์๋ฅผ ๊ฐ์ถ๋ ์ญํ ๋ก ์ฐ์ด๋ ๋๋!(ํด๋ก์ ๋ก ์ ์ฅํด๋๋ ๋๋)
๋ถ๋ณ์ฑ(Immutability)
- ๋ณํ์ง ์๋ ์ฑ์ง
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ ํ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ฑ์ ๊ฐ๋๋ค.
- ๊ฐ์ฒด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ๋ณ์ฑ์ ๊ฐ๋๋ค.
- ๋ถ๋ณํ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด Object.freeze(), rest parameter์ ํตํ ๊ฐ์ฒด ๋ฐํ ๋ฑ์ ๋ฐฉ๋ฒ์ด ์๋ค.
์์ํจ์(Pure Function)
- ๋ถ์ ํจ๊ณผ(side effect)๊ฐ ์๋ ํจ์.
- ์ด๋ค ํจ์์ ๋์ผํ ์ธ์๋ฅผ ์ฃผ์์ ๋,
ํญ์
๊ฐ์ ๊ฐ์ ๋ฐํํ๋ ํจ์ - ์ฆ, ์ฐ๋ฆฌ๊ฐ ์ํ์์ ๋ฐฐ์ฐ๋ ํจ์์ ๊ฐ๋
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- ๋ถ์ ํจ๊ณผ(side effect)๋ฅผ ์์ ๊ณ ์์ ํจ์๋ฅผ ๋ง๋ค์ด ๋ชจ๋ํ ์์ค์ ๋์ด๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์
์ฐธ์กฐ ํฌ๋ช ์ฑ(Referential Transparency)
- ํจ์๊ฐ ํจ์์ ์ธ๋ถ ์ํฅ์ ๋ฐ์ง ์๋ ๊ฒ
- ๋์ผํ ์ ๋ ฅ์ ๋ํด ๋์ผํ ๊ฐ์ ๋ฐํํ๋ ์ฑ์ง
์ฐธ๊ณ ์๋ฃ
- ๊ณ ์ฐจํจ์
- Monad๋ ๋ฌด์์ธ๊ฐ?
- ํจ์ํ ํ๋ก๊ทธ๋๋ฐ - pipe
- teo - ์ผ๋จ ํ๋ฒ ํด๋ณด์ธ์! ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
- teo - ์์ํจ์์ ํฉ์ฑํธ
๐ ์์ฝ ๋ฐ ํ๋ฃจ ๊ฐ๋จ ํ๊ณ
์โฆ ๊ทธ๋๋ ์ด์ ์ด๋์ ๋ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ์ฝ๋๋ฅผ ์ฐ๋ ๋ฒ์ ์ ๊ฒ ๊ฐ๋ค. ๋ฌผ๋ก ์์ง ๋จ์ํ๊ฒ ๊ฐ์ฒด ํ๋์ ํ๋์ ์ ์ํ๊ณ ๊ทธ ์ํ๋ฅผ ๋ค๋ฃจ๋ ์ ๋๋ค. ์ข๋ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ด๊ฐ ์์ฒญํ๊ณ ์ํ๋ ๋ฉ์์ง๋ฅผ ์ ๋๋๊ณ
๊ทธ์ ๋ํ ์ฑ
์ ๋ถ๋ฐฐ๋ฅผ ์ํด์ ์ข๋ ์ ์ฐํ ๊ฐ์ฒด ๊ฐ ํ๋ ฅ์ด ์ด๋ฃจ์ด์ง๋๋ก ํด๋ณด๊ณ ์ถ๋ค!
๊ฐ์ฒด์งํฅ์ผ๋ก ๊ตฌํํ ์ฝ๋๋ฅผ ์ต๋ํ ํจ์ํ์ผ๋ก ์์ฑํด๋ณด๋ คํ๋๋ฐ, ์ฝ์ง๊ฐ ์๋ค. ๊ทธ๋๋ง ํ
์ค์ ๊ธ๋ค ๋๋ถ์ ์กฐ๊ธ์ฉ ์ง๋๊ฐ ๋๊ฐ๊ณ ์๋ค! ํ๋ฐ ์ต๊ด์ ์ผ๋ก ๊ฐ์ฒด๊ฐ ๊ฐ๋ ์ํ๋ ํ๋๋ค์ ํจ์ํ์ ํด๋ก์ ๋ก ์ ๋ฌํ๊ฒ ๋์ด์
์ปค๋ง ํจ์๋ฅผ ๊ตฌํํ๊ฒ ๋๋ค. ์ด๊ฒ ์ณ์ ๊ฑด์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง, ๋ญ๊ฐ ๊ฐ์ธ์ ์ผ๋ก ๊ฐ๋
์ฑ์ ๊ทธ๋ฅ ์์ข์ ๋๋..? ๋ด์ผ์ ์ด ๋ถ๋ถ์ ๋ํด์๋ ์ฐพ์๋ณด๋ ค ํ๋ค. ์ถ๊ฐ๋ก ์์ํจ์์ ๋ํด ์์ง ์กฐ๊ธ ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ ๋ํด ํท๊ฐ๋ฆฌ๋ ๋ถ๋ถ์ด ์์ด
์ด๋ ๊ฒ ๊ธฐ๋กํด๋๋ค.(์ฌ๋ฌ ์ฌ๋๋ค, ์ปค๋ฎค๋ํฐ์๋ ์ฌ๋ ธ์ง๋ง ์์ง ๋ช
๋ฐฑํ ๋ต์ ๋ชป๋ฐ์๋ค..!)
์๋์์ ํจ์ b๋ ์์ํจ์์ธ๊ฐ?!
const a = (x) => x;
const b = (y) => {
const outerValue = a(1);
return y + outerValue;
};
์๋๋ ๋ด๊ฐ ์ปค๋ฎค๋ํฐ์ ์ฌ๋ฆฐ ๋์ ์๊ฐ..!
๋จ์ํ๊ฒ a๋ผ๋ ์ธ๋ถํจ์์ ํธ์ถ์ ๋งค๊ฐ๋ณ์ ์์ด ์ฌ์ฉํ๊ธฐ๋๋ฌธ์ ์์ํจ์๊ฐ ์๋๋ผ๊ณ ์๊ฐ์ด ๋ค์์ด์!
๋ค๋ง, a๊ฐ const๋ก ์ ์ธ๋์๊ธฐ์ ๋ค์ ์ด๊ธฐํ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ณ b ๋ด๋ถ์์ ๊ณ ์ ๋ 1์ด๋ผ๋ ์ธ์๋ฅผ ์ ๋ฌ ์ค์ด๋,
b๋ ์ธ์ ๋ ๊ฐ์ input์ ๋ํด ๊ฐ์ output์ด ๋์ค๋๊น ์์ํจ์๋ผ๊ณ ํ ์๋ ์๋ ์ถ์ด์์..!
์ถ๊ฐ)
์ปค๋ฎค๋ํฐ์์ ์๊ฒ ๋์ด ์ค์ ๋ก ๋ต๊ณ ์ ๋ง ์ ๋ง ์กด๊ฒฝํ๊ฒ ๋ ์๋์ด ๊ฐ๋ฐ์๋ถ๊ป ๋ค์ ๋๋ต!!!(๊ฐ์ฌํฉ๋๋ค, ํ ์ค!)
์์ํจ์์ ์ ์์ ๋ฐ๋ผ ๋ชจ๋ ์ธ๋ถ์ธ์๋ค์ ๋ช
์์ ์ธ ์ธ์๋ก ๋ง๋ค๋ฉด ์ข๊ฒ ์ง๋ง ์ค๋ฌด์๋ ๊ดํ ๋ณต์ก๋๋ฅผ ๊ฐ์ ธ์ค๋๊ฒ ์ฌ์ค์
๋๋ค.
๊ทธ๋์ ์ง๊ธ์ฒ๋ผ ํจ์ ์ธ๋ถ์ ์๋ ๊ฐ์ ๋ช
์์ ์ธ ์ธ์๊ฐ ์๋ ํํ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋ณดํต์ด๊ณ ๊ณ ๋ฏผ์ด ๋ ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ธ๋ถ์ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ ๊ทธ ๋ฐ์ดํฐ๊ฐ ์์๋ผ๋ฉด ์ฌ์ค ์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ์ฝ๋๋ฅผ ๋ฐ๊ฟ์น๊ธฐํ๋ฉด ์ญ์ ์์ํจ์๊ฐ ๋ ํ
๋๊น์.
๊ทธ๋์ ์ง๊ธ์ ์ฝ๋์์์๋ aํจ์์ ์ฌ์ฉ์ ๋ฌธ์ ๋ ๊ฒ ์์ต๋๋ค. aํจ์๋ ์์ํจ์์ด๋ฏ๋ก a(1)์ ๊ฐ์ ์ธ์ ๋ ๊ฐ์ ๊ฐ์ ๋ฐํํ๊ธฐ์ ์์๋ก ์ทจ๊ธํ ์ ์์ต๋๋ค.
์คํ๋ ค ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ outerValue๋ผ๊ณ ํ๋ ๊ฐ์
๋๋ค. outerValue๊ฐ ๋ฌ๋ผ์ง๋ฉด ๊ฐ์ bํจ์ ํธ์ถ์ด๋ผ๋ ๊ฒฐ๊ณผ๊ฐ์ด ๋ฌ๋ผ์ง๊ฒ ๋ฉ๋๋ค.
outerValue๊ฐ ์์๋ผ๋ฉด ๋ฌธ์ ๋ ๊ฒ ์์ต๋๋ค.
์ค๋์ ์ํ ์
- ๊ฐ์ฒด์งํฅ์ผ๋ก ์ผ๋จ ๊ตฌํ ์ฑ๊ณต! ๊ฑฐ๊ธฐ๋ค๊ฐ ํ์ ์คํฌ๋ฆฝํธ! ๊ฑฐ๊ธฐ๋ค๊ฐ ์ธํฐํ์ด์ค๊น์ง ์ฌ์ฉํ๋ค!!!! ๋ฟ๋ฏ!!!!
- ์ง์คํด์ ์๊ฐ ๊ฐ๋ ์ค ๋ชจ๋ฅด๊ณ ๋ชฐ์ ํด์ ๊ณต๋ถํ๋ ์
์ค๋์ ์์ฌ์ด ์
- ๊ตฌํํ๋๋ผ ์ธ๊ฐ์ ๋ชป๋ค์๋ค ใ
- ์ ๋ฌธ์ ์ ๋ช์ผ ๊ฑด๋๋ฐ์๋คโฆ ๋น ๋ฅด๊ฒ ํ์!
- ์๋ฒฝ 6์ ํฌ์ค์ฅ ๋๋ ๊ฐ๊ธฐ ํ๋ค๋โฆ ์กฐ๊ธ๋ง ๋ฐ๋ปํด์ง๋ฉด ๋ ์ฌ์ธ ๊ฑฐ ๊ฐ์ผ๋ ๊ด์ฐฎ๋ค!