ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ฐ์ดํ„ฐ๋ฅผ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„ ๋ผ์ธ์˜ ํ˜•ํƒœ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์ž‘๋™ ํ•˜๋ฉฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ธฐ๋ฒ•์œผ๋กœ, ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. (ํด๋กœ์ €, ํ•˜์Šค์ผˆ, ๋ฆฌ์Šคํ”„)
  • ๊ฐ์ฒด์ง€ํ–ฅ ์ถ”์ƒํ™”์˜ ์ตœ์†Œ๋‹จ์œ„๊ฐ€ ๊ฐ์ฒด์ธ๊ฒƒ ์ฒ˜๋Ÿผ ํ•จ์ˆ˜ํ˜•์€ ํ•จ์ˆ˜๊ฐ€ ์ตœ์†Œ ๋‹จ์œ„์ด๋‹ค.
  • ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด์ง€๋ฏ€๋กœ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’๋‹ค.
  • ๋ถˆ๋ณ€์„ฑ์„ ์ง€ํ–ฅํ•˜๊ธฐ์— ๋™์ž‘์„ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฝ๊ณ  ๋ถ€์ˆ˜ํšจ๊ณผ(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
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
[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): ํ•จ์ˆ˜๋ฅผ ๊ฐ’์œผ๋กœ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜ ๊ฐœ๋…์ด ํ’๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”์™€ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ๊ฐ„๊ฒฐ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ: ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ž‘์€ ํ•จ์ˆ˜๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ๋” ํฐ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง€๊ณ  ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ธฐ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  • ๋ณ‘๋ ฌ ๋ฐ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ ์šฉ์ด์„ฑ: ๋ถˆ๋ณ€์„ฑ๊ณผ ๋ถ€์ž‘์šฉ ์ตœ์†Œํ™”๋กœ ์ธํ•ด ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ณ‘๋ ฌ ๋ฐ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๋˜๋Š” ํ”„๋กœ์„ธ์Šค์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ: ์ˆœ์ˆ˜ ํ•จ์ˆ˜์™€ ๋ถˆ๋ณ€์„ฑ์€ ์ฝ”๋“œ์˜ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐ ํ•จ์ˆ˜๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๊ณ , ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์ด ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.