๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

JavaScript

JavaScript (ES6) - ํ•จ์ˆ˜์˜ ์„ ์–ธ๊ณผ ํ‘œํ˜„ ( Arrow Function )

๊ธ€์„ ์ž‘์„ฑํ•˜๊ธฐ์— ์•ž์„œ ์ด ๊ฒŒ์‹œ๊ธ€์˜ ์ง€์‹์€ ์œ ํŠœ๋ธŒ ๋“œ๋ฆผ ์ฝ”๋”ฉ by ์—˜๋ฆฌ๋‹˜์˜ ๋™์˜์ƒ์ด ์ถœ์ฒ˜์ž„์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

https://www.youtube.com/watch?v=e_lU39U-5bQ&list=PLv2d7VI9OotTVOL4QmPfvJWPJvkmv6h-2&index=5

 

๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ ๋ช…์‚ฌ

ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๋™์‚ฌ๋กœ ์ž‘๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ ์ด๋‹ค

(ex. do-something)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ Function์€ Object์ด๋‹ค.

 

 

Function์˜ ์˜ˆ์‹œ

 

function printHello() {
  console.log('hello');
}
printHello();

 

์œ„์™€ ๊ฐ™์€ function์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ 'hello'๊ฐ€ ์ถœ๋ ฅ์ด ๋œ๋‹ค

 

hello

 

ํ•˜์ง€๋งŒ ์œ„์˜ function์€ ๋งค์šฐ ์“ธ ์ผ์ด ์—†๋‹ค ๋ณดํ†ต ์•„๋ž˜์™€ ๊ฐ™์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›์•„์™€์„œ function์„ ์ž‘์„ฑํ•œ๋‹ค

 

 

function print(massage) {
  console.log('massage');
}
print('hello');

 

์œ„์˜ ์ฝ”๋“œ๋Š” print๋ผ๋Š” function์„ ํ˜ธ์ถœํ•˜์—ฌ message๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค

 

 


 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” C ๋‚˜ Java์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค

๊ทธ๋ž˜์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ˆซ์ž๋กœ ๋ฐ›์„ ๊ฒฝ์šฐ์—๋Š” ์ˆซ์ž๋ฅผ ๋ฌธ์žํ˜•์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฌธ์ž๋กœ ์ถœ๋ ฅ์ด ๋˜๋Š”๋ฐ

ํ•˜์ง€๋งŒ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ์ง€์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค

๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ง€์ •ํ•ด์ฃผ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋” ์ข‹์€ (?) ์ด์œ ๋Š” ํ•จ์ˆ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ๋ด๋„

๋ฌด์—‡์„ ํ•˜๋Š” ํ•จ์ˆ˜์ธ์ง€ ํ•œ ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ธ ๋“ฏํ•˜๋‹ค

โ€‹

์•„์ง ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์šฐ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•ด ์ฃผ์ง€ ์•Š๊ณ  ์ฝ”๋”ฉ์„ ํ•ด๋ณด๋„๋ก ํ•˜์ž!

( C์–ธ์–ด๋งŒ 3๋…„์„ ๊ณต๋ถ€ํ•œ ๋‚˜๋กœ์„œ๋Š” ๋„ˆ๋ฌด ์ ์‘์ด ๋˜์ง€ ์•Š๋Š”๋‹ค ใ…‹ใ…‹ )

 

Default parameters

 

ES6์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋˜์–ด์ง„ ๊ธฐ๋Šฅ์ด๋ฉฐ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค

 

function showMessage(message, from){
  console.log(`${message} by ${from}`);
}
showMessage('Hi!');

 

์œ„์™€ ๊ฐ™์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ message์˜ ๊ฐ’์€ ๋ฐ›์•˜์ง€๋งŒ from์˜ ๊ฐ’์€ ๋ฐ›์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ์—

 

 

Hi! by undefined

 

์œ„์™€ ๊ฐ™์ด undefined ๋ผ๋Š” ๊ฐ’์ด ์ถœ๋ ฅ์ด ๋œ๋‹ค ํ•˜์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์ง€์ •๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ default ๊ฐ’์„ ์ง€์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ

 

 

function showMessage(message, from = 'unknown'){
  console.log(`${message} by ${from}`);
}
showMessage('Hi!');

 

์œ„์™€ ๊ฐ™์ด default ๊ฐ’์„ ์ง€์ •ํ•ด๋†“์•˜์„ ๊ฒฝ์šฐ unknown ์ด๋ผ๋Š” ๊ฐ’์ด ์ถœ๋ ฅ์ด ๋œ๋‹ค!

 

 


 

Function์— ๋ฐฐ์—ด์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๊ธฐ

 

function์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ›์œผ๋ ค๋ฉด

 

function printAll(...args) {
  for(let i = 0; i < arg.length; i++) {
    console.log(args[i]);
  }
}

printAll('A', 'B', 'C');

 

์œ„์™€ ๊ฐ™์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์•ž์— ... ์„ ๋ถ™์—ฌ์•ผํ•œ๋‹ค๊ณ  ๋ฐฐ์› ๋‹ค

๋˜ for ๋ฐ˜๋ณต๋ฌธ์„ ๋‹ค๋ฅด๊ฒŒ๋„ ์“ธ ์ˆ˜ ์žˆ๋‹ค

 

 

for (const arg of args){
  console.log('arg');
}

 

์œ„์™€๊ฐ™์ด ์ด๋ ‡๊ฒŒ of๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ๋” ๊ฐ„ํŽธํ•œ ๋ฐฉ๋ฒ•์€

 

 

args.forEach((arg) => console.log(arg));

 

์œ„์™€๊ฐ™์ด forEach๋ผ๋Š” ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋ฅผ ์ด์šฉํ•ด๋„ ๋œ๋‹ค

โ€‹

์…‹ ๋‹ค ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ ์•„์ง๊นŒ์ง€๋Š” ์ •์„๋Œ€๋กœ for๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํŽธํ•ด์„œ ๋งŽ์ด ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค

 

 


 

Early return, early exit

 

ํ˜„์—…์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š” ํ˜•์‹์œผ๋กœ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ์ฝ”๋“œ๋ฅผ ๋”์šฑ ์ ๊ฒŒ ์“ฐ๊ธฐ ์œ„ํ•ด ์“ฐ๋Š” ๋ฐฉ์‹์ด๋‹ค

 

function upgradeUser(user) {
  if(user.point > 10) {
    elseif ... else
  }
}

 

์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด if๋ฌธ์˜ 10 ๋ณด๋‹ค ํด ๊ฒฝ์šฐ์— ์กฐ๊ฑด๋ฌธ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๊ณ  ์•„๋‹ ๊ฒฝ์šฐ

elseif .. else ๊นŒ์ง€ ์ด์–ด์ ธ์„œ ๋กœ์ง์ด ๊ธธ์–ด์ง€๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ๋ณด๋‹ค๋Š”

 

 

function upgradeUser(user) {
  if(user.point <= 10) {
    return;
  }
  // long upgrade logic ...
}

 

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์กฐ๊ฑด๋ฌธ์„ ๋งŒ์กฑํ•˜์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ๋นจ๋ฆฌ ๋ฆฌํ„ด์„ ํ•˜๊ณ  ์•„๋‹Œ ๊ฒฝ์šฐ์—๋งŒ ์กฐ๊ฑด๋ฌธ์—์„œ ๋ฒ—์–ด๋‚˜

long upgrade logic ์—์„œ ์กฐ๊ฑด์ด ์‹คํ–‰์ด ๋˜๋Š” ํ˜•์‹์ด๋‹ค

 

 


 

Function expression

 

์œ„์—์„œ function์„ ์„ ์–ธํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ ์–ธ์„ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

const print = function() { 
  console.log('print');
};
print();

 

์œ„์™€ ๊ฐ™์ด function ์„ ์„ ์–ธํ•จ๊ณผ ๋™์‹œ์— print๋ผ๋Š” ๋ณ€์ˆ˜์— ํ• ๋‹น์„ ํ•˜๊ฒŒ ๋˜๋ฉด print๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ function์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค

์œ„์™€ ๊ฐ™์ด function์˜ ์ด๋ฆ„ ์—†์ด ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ anonymous function ์ด๋ผ๊ณ ํ•˜๊ณ  ์ด๋ฆ„์„ ์ง€์ •ํ•ด์„œ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์„ named function ์ด๋ผ๊ณ  ํ•œ๋‹ค

โ€‹

๋˜ print๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜๋„ ์žˆ๋‹ค

 

 

const printAgain = print;
printAgain();

 

์ด๋ ‡๊ฒŒ print ๋ณ€์ˆ˜๋ฅผ printAgain์— ํ• ๋‹นํ•˜๊ฒŒ ๋˜๋ฉด printAgain ๋ณ€์ˆ˜๊ฐ€ ' print '๋ฅผ ์ถœ๋ ฅํ•˜๊ฒŒ ๋œ๋‹ค

โ€‹

(์ดํ•ดํ•  ์ˆ˜ ์—†๋Š” ์ด์ƒํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ .... )

 


 

Callback

 

Callback ํ•จ์ˆ˜์˜ ์˜ˆ

 

function randomQuiz(answer, printYes, printNo) {
  if(answer === 'love you') {
    printYes();
  }else {
   printNo();
  }
}

 

์œ„์™€ ๊ฐ™์ด answer์˜ ๊ฐ’์„ ๋ฐ›์•„์„œ 'love you' ์™€ ๊ฐ™๋‹ค๋ฉด printYes๋ฅผ , ๋‹ค๋ฅด๋ฉด printNo ๋ผ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค

randomQuiz ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ answer์™€ printYes, printNo ๋ผ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— expression ๋‘ ๊ฐœ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค

 

 

const printYes = function () {
  console.log('yes!');
};

const printNo  = function print() {
  console.log('no!');
};
randomQuiz('wrong', printYes, printNo);
randomQuiz('love you', printYes, printNo);

 

์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ printYes, printNo๋ฅผ expression ์œผ๋กœ ์„ ์–ธํ•˜์—ฌ randomQuiz ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ์„œ ํ˜ธ์ถœ์ด ๋œ๋‹ค

โ€‹

printYes๋Š” anonymous function์ด๊ณ  ์ด๊ณ 

printNo๋Š” named function์ธ๋ฐ printNo๋Š” print๋ผ๊ณ  ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

์ด๊ฒƒ์€ ๋””๋ฒ„๊น…์„ ํ•  ๋•Œ stack trace์— ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด ๋‚˜์˜ค๊ธฐ ์œ„ํ•จ์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋˜๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœํ•  ๋•Œ์— ํ•„์š”ํ•˜๋‹ค!

 


 

Arrow function

 

Arrow function์€ ํ•ญ์ƒ ์ด๋ฆ„์ด ์—†๋Š” anonymous function์ด๋‹ค.

function expression์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์•„์ด๋ผ๊ณ  ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค..!

โ€‹

โ€‹

์ดํ•ด๊ฐ€ ์‰ฝ๋„๋ก ์œ„์—์„œ ์„ ์–ธํ–ˆ๋˜ function expression์„ ๊ฐ€์ ธ์™€์„œ ์˜ˆ์‹œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž

 

const printYes = function () {
  console.log('yes!');
};

 

์ด๋ ‡๊ฒŒ ์ž‘์„ฑ๋˜์–ด์žˆ๋˜ function expression์„ ์•„๋ž˜์™€ ๊ฐ™์ด Arrow function์œผ๋กœ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

const printYes = () => console.log('yes!');

 

์งœ์ž”...!

โ€‹

return์„ ํ•ด์ค˜์•ผ ํ•˜๋Š” function expression์„ Arrow function์œผ๋กœ ๋ฐ”๊ฟ”๋ณด๋Š” ์ฝ”๋“œ๋„ ์ž‘์„ฑํ•ด๋ณด์ž

โ€‹

 

const add = function (a, b) {
return a + b;
};

 

์œ„์˜ ์ฝ”๋“œ๋Š” add๋ผ๋Š” ์ด๋ฆ„์˜ function expression์ด๋ฉฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ a์™€ b๋ฅผ ๋ฐ›์•„ ๋”ํ•ด์„œ return ํ•˜๋Š” ๊ฒƒ์ด๋‹ค

์ด๋ฅผ Arrow function์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์ž

 

 

const add = (a , b) => a + b;

 

์จ”์ž”....!

โ€‹

ํ•จ์ˆ˜ ์•ˆ์—์„œ ๋‹ค๋ฅธ ์ผ๋“ค์ด ํ•„์š”ํ•ด์„œ ๋ธ”๋ก { } ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด

 

 

const simpleMultiply = ( a , b ) => {
  // do something more
  return a * b;
};

 

์œ„์™€ ๊ฐ™์ด ๋ธ”๋ก์„ ๋„ฃ์–ด์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Œ€์‹  ๋ธ”๋Ÿญ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด return์„ ์ด์šฉํ•ด์„œ ๊ฐ’์„ return ํ•ด์ค˜์•ผ ํ•œ๋‹ค!

โ€‹

โ€‹

์ด๋ ‡๊ฒŒ JavaScript์˜ ํ•จ์ˆ˜์˜ ์„ ์–ธ๊ณผ ํ‘œํ˜„์„ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ ์†์— ์ต์„ ๋•Œ๊นŒ์ง€ ๊ณต๋ถ€๋ฅผ ํ•ด์•ผ๊ฒ ๋‹ค

โ€‹