๋ฐ์ดํฐ๋ฅผ ํจ์๋ฅผ ์ด์ฉํด ์๋ก์ด ๋ฐ์ดํฐ๋ก ๋ง๋ค์ด ๋๊ฐ๋ ๋ฐ์ดํฐ ํ์ดํ ๋ผ์ธ์ ํํ๋ก ํ๋ก๊ทธ๋๋ฐ์ด ์๋ ํ๋ฉฐ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ์์ ํจ์๋ก ๋๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ธฐ๋ฒ์ผ๋ก, ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ํจ์๋ฅผ ์์ฑํ์ฌ ๊ฐ๋
์ฑ์ ๋์ด๊ณ ์ ์ง๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํด์ค๋ค. (ํด๋ก์ , ํ์ค์ผ, ๋ฆฌ์คํ)
- ๊ฐ์ฒด์งํฅ ์ถ์ํ์ ์ต์๋จ์๊ฐ ๊ฐ์ฒด์ธ๊ฒ ์ฒ๋ผ ํจ์ํ์ ํจ์๊ฐ ์ต์ ๋จ์์ด๋ค.
- ํจ์ ๋จ์๋ก ๋๋์ด์ง๋ฏ๋ก ์ฌ์ฌ์ฉ์ฑ์ด ๋๋ค.
- ๋ถ๋ณ์ฑ์ ์งํฅํ๊ธฐ์ ๋์์ ์์ธกํ๊ธฐ ์ฝ๊ณ ๋ถ์ํจ๊ณผ(Side Effect)๋ฐฉ์งํ๋ค.
- ๋ถ์ํจ๊ณผ(Side Effect)๋ฅผ ๋ฐฉ์ง ํ๋ค๋ ๊ฒ์ ๋์์ฑ ๋ฌธ์ ๋ ํด๊ฒฐ๋๋ค๋ ์๋ฏธ์ด๋ค.
ํจ์ํ vs. ์ ์ฐจํ
์๋์ ์ฝ๋๋ N๊ฐ์ ์ซ์๊ฐ ๊ณต๋ฐฑ ์์ด ์ฐ์ฌ์๋ค.
์ด ์ซ์๋ฅผ ๋ชจ๋ํฉํด์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ด ์ซ์๋ฅผ ๋ชจ๋ํฉํด์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์) "12345" -> 15
๐ ์ ์ฐจํ ํ๋ก๊ทธ๋๋ฐ
์ ์ฐจํ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋จ์ ์ผ๋ จ์ ์ ์ฐจ๋ ๋ช
๋ น์ด๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ์์
๋๋ค. ์ ์ฐจํ ์ธ์ด๋ ์ํ๋ฅผ ์ค์ฌ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ฉฐ, ๋ช
๋ น์ด์ ์์๊ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ํ๋ก์์ (์ ์ฐจ)๋ฅผ ์์ฑํ๊ณ ํธ์ถํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์์ด ํน์ง์
๋๋ค.
const stringNumber = "12345"; let sum = 0; for(let i=0; i < stringNumber.length; i+=1){ sum += stringNumber[i] - "0"; }
๐ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํจ์๋ฅผ ์ฃผ์ ๊ตฌ์ฑ ์์๋ก ์ผ๋ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์
๋๋ค. ํจ์ํ ์ธ์ด๋ ์ํ ๋ณ๊ฒฝ์ ํผํ๊ณ , ๋ถ๋ณ์ฑ์ ๊ฐ์กฐํ๋ฉฐ, ํจ์ ์กฐํฉ์ฑ์ ์ค์ ์ ๋ก๋๋ค. ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์
๋ ฅ๊ณผ ์ถ๋ ฅ ๊ฐ์ ๊ด๊ณ๋ฅผ ์ ์ํ๋ ํจ์๋ค์ ์กฐํฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ฉฐ, ๋ถ์์ฉ์ ์ต์ํํ๋ ค๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
const stringNumber = "12345"; let result = stringNumber.split(" ") .map((num) => parseInt(num)) .reduce((acc, value) => acc + value, 0);
์ ์ธํ vs. ๋ช ๋ นํ
๐ ๋ช ๋ นํ
๋ช
๋ นํ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋จ์ด ์ด๋ป๊ฒ ์ํ๋๋์ง๋ฅผ ๋ช
์์ ์ผ๋ก ๋ํ๋ด๋ ์คํ์ผ์
๋๋ค. ๋๋ถ๋ถ์ ์ ์ฐจํ ์ธ์ด๊ฐ ๋ช
๋ นํ ํจ๋ฌ๋ค์์ ๋ฐ๋ฆ
๋๋ค. ํ๋ก๊ทธ๋๋จธ๋ ์ํ์ ๋ช
๋ น์ด์ ์์์ ์ค์ ์ ๋์ด ํ๋ก๊ทธ๋จ์ ์์ฑํฉ๋๋ค.
๐ control Flow
Goto
if/Then/Else
Switch/Case
For/While
if/Then/Else
Switch/Case
For/While
const stringNumber = "12345"; let result = stringNumber.split(" ") .map((num) => parseInt(num)) .reduce((acc, value) => acc + value, 0);
๐ ์ ์ธํ
์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ช
ํ๊ณ , ์์คํ
์ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ป๊ฒ ๋ฌ์ฑํ ์ง์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๋จ๊ณ๋ ์์๋ฅผ ๋ช
์ํ์ง ์๋ ์คํ์ผ์ด๋ค. ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ์๋ก SQL, HTML, CSS ๋ฑ์ด ์๋ค. ํ๋ก๊ทธ๋๋จธ๋ "๋ฌด์(What)"์ ๋ช
์ํ๊ณ , ํด๊ฒฐ๋ฐฉ๋ฒ์ ์ปดํจํฐ์๊ฒ ์์ํ๋ ๋ฐฉ๋ฒ ์ด๋ค.
๐ control Flow
Stateless
Recursion
pipe
Recursion
pipe
[1,2,3,4,5].filter(v => v% === 0) .forEach(v => console.log(v));
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฅ์
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ค์ํ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ด์ ๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ด๋ฅผ ์ ํธํ๋ ์ด์ ๊ฐ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ฃผ์ ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ถ๋ณ์ฑ (Immutability): ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ๋ถ๋ณ์ ๊ตฌ์กฐ๋ก ๋ค๋ฃน๋๋ค. ์ด๋ก์จ ๋ถ์์ฉ์ด ๊ฐ์ํ๊ณ , ์ฝ๋์ ์์ธก ๊ฐ๋ฅ์ฑ๊ณผ ์์ ์ฑ์ด ๋์์ง๋๋ค. ๋ํ, ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์บ์ฑ ๋ฑ์ ์ต์ ํ๊ฐ ์ฌ์์ง๋๋ค.
- ์์ ํจ์ (Pure Functions): ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์๋ ์์ ํจ์๋ฅผ ๊ฐ์กฐํฉ๋๋ค. ์์ ํจ์๋ ์ ๋ ฅ ๊ฐ์๋ง ์์กดํ๋ฉฐ, ๊ฐ์ ์ ๋ ฅ์ ๋ํด์๋ ํญ์ ๊ฐ์ ์ถ๋ ฅ์ ๋ฐํํฉ๋๋ค. ์ด๋ก์จ ์ฝ๋์ ํ ์คํธ, ๋๋ฒ๊น , ์ดํด๊ฐ ์ฉ์ดํด์ง๋ฉฐ, ์์ธก ๊ฐ๋ฅํ ๋์์ ๋ณด์ฅํฉ๋๋ค.
- ๋ถ์์ฉ ์ต์ํ (Minimizing Side Effects): ๋ถ์์ฉ(side effect)์ ์ต์ํํ์ฌ ์ฝ๋์ ์์ ์ฑ์ ๋์ ๋๋ค. ๋ถ์์ฉ์ ํจ์ ํธ์ถ๋ก ์ธํด ๋ฐ์ํ๋ ์ธ๋ถ ์ํ ๋ณ๊ฒฝ์ ์๋ฏธํ๋ฉฐ, ์ด๋ฅผ ์ต์ํํจ์ผ๋ก์จ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ฝ๊ณ ๋๋ฒ๊น ์ด ์ฌ์์ง๋๋ค.
- ๊ณ ์ฐจ ํจ์ (Higher-order Functions): ํจ์๋ฅผ ๊ฐ์ผ๋ก ๋ค๋ฃฐ ์ ์๋ ๊ณ ์ฐจ ํจ์ ๊ฐ๋ ์ด ํ๋ถํฉ๋๋ค. ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๊ฑฐ๋ ํจ์๋ฅผ ๋ฐํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๋ชจ๋ํ์ ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง๋๋ค.
- ์ฝ๋ ๊ฐ๊ฒฐ์ฑ๊ณผ ๊ฐ๋ ์ฑ: ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์์ ํจ์๋ค์ ์กฐํฉํ์ฌ ๋ ํฐ ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ์ด ๋์ต๋๋ค. ์ด๋ก์จ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง๊ณ ๋ฒ๊ทธ๋ฅผ ์ฐพ๊ธฐ ์ฌ์์ง๋๋ค.
- ๋ณ๋ ฌ ๋ฐ ๋ถ์ฐ ์ฒ๋ฆฌ ์ฉ์ด์ฑ: ๋ถ๋ณ์ฑ๊ณผ ๋ถ์์ฉ ์ต์ํ๋ก ์ธํด ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋ณ๋ ฌ ๋ฐ ๋ถ์ฐ ์ฒ๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ์ํํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ค๋ ๋ ๋๋ ํ๋ก์ธ์ค์์ ์์ ํ๊ฒ ๋์ํ ์ ์์ด์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ํ ์คํธ ์ฉ์ด์ฑ: ์์ ํจ์์ ๋ถ๋ณ์ฑ์ ์ฝ๋์ ํ ์คํธ ์ฉ์ด์ฑ์ ์ฆ๊ฐ์ํต๋๋ค. ๊ฐ ํจ์๋ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ ์ ์๊ณ , ์์ธก ๊ฐ๋ฅํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ํ ์คํธ ์์ฑ์ด ์ฌ์์ง๋๋ค.