article thumbnail image
Published 2022. 7. 24. 23:52

1. ES(ECMA Script)

ECMAScript(ES5๋‚˜ ES2015์˜ ES๋Š” ECMAScript์˜ ์ค„์ž„๋ง์ด๋‹ค.)๋Š” Ecma ์ธํ„ฐ๋‚ด์…”๋„์—์„œ ์ •์˜ํ•œ ECMA-262 ๊ธฐ์ˆ  ๊ทœ๊ฒฉ์— ์ •์˜๋œ ํ‘œ์ค€ ์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ํ‘œ์ค€ํ™”๋œ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
๋Œ€์ค‘์ ์œผ๋กœ ์œ ๋ช…ํ•œ ES6์˜ ๊ฒฝ์šฐ ES5 ์ดํ•˜ ๋ช…์„ธ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ ๋ถ€๋ถ„๋“ค์ด ํ•ด๊ฒฐ๋˜์—ˆ๊ณ , ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ ๋” ๊ฐ€๋…์„ฑ ๋ฐ ์œ ์ง€ ๋ณด์ˆ˜์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋•์— ์›น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์œ ๋ช… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค(lodash, React, Vue ๋“ฑ)์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๋„ ES6๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๋„ ES6๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ›จ์”ฌ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ES6์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ฌธ๋ฒ•, ๊ธฐ๋Šฅ๋“ค

2.1. ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ์ง€์›

์ง€๊ธˆ์€ IE(Internet Explorer)๊ฐ€ ๊ณต์‹์ ์œผ๋กœ ์ง€์› ์ข…๋ฃŒ๋˜๋ฉฐ, IT ์—…๊ณ„์—์„œ๋Š” ์‚ฌ์žฅ๋˜์—ˆ์ง€๋งŒ ์ „ ์„ธ๊ณ„ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ์•„์ง IE๋ฅผ ์‚ฌ์šฉ์ค‘์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด์— Babel ์ด๋ผ๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋“ฑ์žฅํ•˜๋ฉด์„œ, ๊ฐ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ๊ฐ„๊ทน์„ ํ•ด์†Œ์‹œ์ผœ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ES6 ๋ฌธ๋ฒ•์˜ ๊ฒฝ์šฐ IE์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์—†๋Š”๋ฐ, ์ด๋•Œ Babel์„ ์‚ฌ์šฉํ•ด ES6 ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋œ JavaScript ์ฝ”๋“œ๋ฅผ IE๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” JavaScript ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2.2. let, const์˜ ๋“ฑ์žฅ

ES6 ์ด์ „ ๋ฌธ๋ฒ•์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” var ํ‚ค์›Œ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ์„ ํƒ์ง€๋ฐ–์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
ํƒ€ ์–ธ์–ด๋“ค๊ณผ๋Š” ๋‹ฌ๋ฆฌ JavaScript์—์„œ var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‹จ์œ„์˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— if๋ฌธ์ด๋‚˜ for๋ฌธ ๋ธ”๋ก ๋‚ด์—์„œ var๋ฅผ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋“ค๋„ ๋ธ”๋ก ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ var๋ฅผ ์ด์šฉํ•˜๋ฉด ์„ ์–ธ ์ „์— ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ํ˜ธ์ด์ŠคํŒ…(hoisting)๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ด์— JavaScript ๊ฐœ๋ฐœ์ž๋“ค์€ ๋ณ€์ˆ˜๋ช… ์ถฉ๋Œ, ์˜๋„์น˜ ์•Š์€ ๊ฐ’ ๋ณ€๊ฒฝ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋…ธ๋ ฅ๋“ค์„ ํ•ด์™”์Šต๋‹ˆ๋‹ค.

 

2.2.1. ๋ธ”๋ก ์Šค์ฝ”ํ”„ ์ง€์›

let, const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ณณ์—์„œ๋„ ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์–ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์„ ์–ธ์— let, const๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์‹ค์ˆ˜์™€ ๋ฒ„๊ทธ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ES5

function sayHello(name) {
  if (!name) {
    var errorMessage = '"name" parameter should be non empty String.';

    alert(errorMessage);
  }

  console.log('Hello, ' + name + '!');
  console.log(errorMessage); // '"name" parameter should be non empty String.'
}

ES6

function sayHello(name) {
  if (!name) {
    let errorMessage = '"name" parameter should be non empty String.';

    alert(errorMessage);
  }

  console.log('Hello, ' + name + '!');
  console.log(errorMessage); // ReferenceError
}

ES5์—์„œ๋Š” if ๋ธ”๋ก์˜ ์‹คํ–‰์ด ๋๋‚œ ์ดํ›„์—๋„ errorMessage๋ณ€์ˆ˜์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” var๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„์— ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์œ„ ์ฝ”๋“œ์˜ errorMessage ๋ณ€์ˆ˜๋Š” sayHello()ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— if ๋ธ”๋ก์„ ๋น ์ ธ๋‚˜์˜จ ์ดํ›„์—๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ let, const ๋‘ ๋ณ€์ˆ˜ ์„ ์–ธ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก ์Šค์ฝ”ํ”„์— ์ถ”๊ฐ€๋˜๋ฏ€๋กœ if ๋ธ”๋ก ์™ธ๋ถ€์—์„œ errorMessage์— ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ ReferenceError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

2.2.2. ES5 ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…(Hoisting)์˜ ๋ฌธ์ œ์  ๊ฐœ์„ 

var ํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ์„ ์–ธ ์ด์ „์— ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜ธ์ด์ŠคํŒ… ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜ธ์ด์ŠคํŒ…์ด ์—†๋Š” let, const๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์˜๋„์น˜ ์•Š์€ ์‹ค์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ES5

here = '์—ฌ๊ธฐ์•ผ~';    // ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”๊ฐ€ ๋จผ์ € ๋˜์žˆ์ง€๋งŒ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

console.log(here); // '์—ฌ๊ธฐ์•ผ~'

var here;          // ๋ณ€์ˆ˜ ์„ ์–ธ์€ ์ด๋ถ€๋ถ„์— ์žˆ์Šต๋‹ˆ๋‹ค.

ES6

here = '์—ฌ๊ธฐ์•ผ~'; // ReferenceError - ๋ณ€์ˆ˜ here๊ฐ€ ์„ ์–ธ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

console.log(here);

let here;

๋จผ์ € ES5์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒŒ๋˜๋ฉด, here ๋ณ€์ˆ˜ ์„ ์–ธ๋ณด๋‹ค ๋จผ์ € ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์žˆ๋Š”๋ฐ๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ ์ด๋Ÿฐ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์ผ๊นŒ์š”?
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๊ฐ€์žฅ ๋จผ์ € var, function์„ ์ฐพ์•„์„œ ์Šค์ฝ”ํ”„์˜ ์ตœ์ƒ๋‹จ์— ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ˜ธ์ด์ŠคํŒ…์œผ๋กœ ์ธํ•ด ์‹ค์ˆ˜์— ์˜ํ•œ ์˜ค๋ฅ˜๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ฐ์ง€ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ , ์˜๋„์น˜ ์•Š์€ ๋™์ž‘์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ES6์˜ let์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ ์‹คํ–‰ํ•ด๋ณด๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. here ๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™” ์ด์ „์— ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

2.2.3. let๊ณผ const์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ์ฐจ์ด์ 

๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ์— ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์€ const๋ฅผ, ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ let์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

// ๊ฐ’ ์ˆ˜์ •
let foo = 'foo';
foo = 'foo2'; // OK - ๊ฐ’ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

const bar = 'bar';
bar = 'bar2'; // Type error - bar ๋ณ€์ˆ˜๋Š” ์ƒ์ˆ˜์ด๋ฏ€๋กœ ๊ฐ’ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

// ์„ ์–ธ, ์ดˆ๊ธฐํ™”
const baz2;   // Type error - const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™” ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

let baz;      // OK - let์œผ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
baz = 'baz';

์œ„ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด let์€ var์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ, ๊ฐ’ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ const๋ณ€์ˆ˜์˜ ๊ฐ’์€ ํ•œ ๋ฒˆ ์ •์˜ํ•˜๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๋™์‹œ์— ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๊ณ , const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ฌธ๋ฒ• ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ const๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค ํ•ด๋„ ํ”„๋กœํผํ‹ฐ๊นŒ์ง€ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

// const ๋ณ€์ˆ˜์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’ ์ˆ˜์ •
const foo2 = {
  bar2: 'bar'
};

foo2.bar2 = 'bar2'; // OK - foo2์˜ ํ”„๋กœํผํ‹ฐ๋Š” ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด ์„ ์–ธ์— const๋ฅผ ์‚ฌ์šฉํ–ˆ์œผ๋ฏ€๋กœ ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฐฐ์—ด ์š”์†Œ๊นŒ์ง€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ๊ฐ’์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2.3. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(Arrow function)

ES6๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ํ•จ์ˆ˜์˜ ๋Œ€์ฒด์ œ๋กœ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.
๊ธฐ๋ณธ์ ์ธ ํ‘œํ˜„์‹์€ ์ด๋ ‡์Šต๋‹ˆ๋‹ค.

// ์ผ๋ฐ˜ ํ•จ์ˆ˜(function)
function func() {
    // ...
}

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(arrow function)
let func = () => {
    // ...
}

ํ•จ์ˆ˜์˜ ๋Œ€์ฒด์ œ๋กœ์จ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฑด ๋งž์ง€๋งŒ ์—„์—ฐํžˆ ๋‹ค๋ฅธ ๋ถ€๋ถ„์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์™„๋ฒฝํ•œ ๋Œ€์ฒด์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ๊นŒ์š”?

 

์ฒซ์งธ, ํ‘œํ˜„์ด ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค.


// ์ผ๋ฐ˜ ํ•จ์ˆ˜
let add = function(a, b) {
    return a + b;
};


// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜
let add = (a, b) => a + b; // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์˜ ํŠน์ง•์œผ๋กœ ํ‘œํ˜„์‹์ด ์—ฌ๋Ÿฌ ์ค„์ด ์•„๋‹๊ฒฝ์šฐ ์ค‘๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
let add2 = a => a * 2; // ์ธ์ž๊ฐ€ ํ•˜๋‚˜์ผ ๊ฒฝ์šฐ ์†Œ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
// ๋” ์งง์€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์‚ฌ์šฉ

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

console.log(sum(10, 100)); // 110

์ด๋Ÿฐ ์งง์€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ํŠนํžˆ Array.prototype.map()์ด๋‚˜, Array.prototype.filter()๋“ฑ์— ๋„˜๊ฒจ์ฃผ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹ ์‚ฌ์šฉ
const numbersOverFive = numbers.filter(function(number) {
  return number > 5;
});

console.log(numbersOverFive); // [6, 7, 8, 9, 10] ;

// ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜ 1์ค„ ํ‘œํ˜„
const numbersOverFive = numbers.filter(number => number > 5)

console.log(numbersOverFive); // [6, 7, 8, 9, 10] ;

์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ๋„˜๊ฒจ์ค„ ๋•Œ ๋ณด๋‹ค ํ›จ์”ฌ ์งง๊ณ  ๊ฐ„๊ฒฐํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ function์œผ๋กœ ์„ ์–ธํ•œ ํ•จ์ˆ˜์™€ ๋ช‡ ๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— this, arguments, super๋‚˜ new.target์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ž…๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์— ๋ณ„๋„์˜ this๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋Œ€์‹ , ํ•ด๋‹น ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋œ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์˜ this๋ฅผ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅธ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๋‘˜์งธ, this ๋ฐ”์ธ๋”ฉ์ด function๊ณผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
ES5์—์„œ๋Š” DOM์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ES5

var buzzer = {
  name: 'Buzzer1',
  addClickEvent: function() {
    this.element = document.getElementById(this.name);

    var logNameAndRemoveButton = function() {
      console.log(this.name + ' buzzing!');
    }

    this.element.addEventListener('click', logNameAndRemoveButton.bind(this)); // logNameAndRemoveButton ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜ ์‹คํ–‰์‹œ this ๊ฐ์ฒด๊ฐ€ ์—˜๋ฆฌ๋จผํŠธ ๊ฐ์ฒด ์ด๋ฏ€๋กœ "bind(this)"๋ฅผ ์ด์šฉํ•ด์„œ this๊ฐ์ฒด๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.
  }
};

buzzer.addClickEvent();

ES6

const buzzer = {
  name: 'Buzzer1',
  addClickEvent() {
    this.element = document.getElementById(this.name);

    this.element.addEventListener('click', () => {  // buzzerElement์— ๋‹ค์‹œ this ๋ฐ”์ธ๋“œ๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ์˜๋„ํ•œ ๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค.
      console.log(this.name + ' buzzing!');
      document.body.removeChild(this.element);
    });
  }
};

buzzer.addClickEvent();

์—˜๋ฆฌ๋จผํŠธ์— ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋Š” non-strict ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•ด์„œ ํ•ธ๋“ค๋Ÿฌ์—์„œ this ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋ฉด ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ ๊ฐ์ฒด๊ฐ€ ํƒ์ƒ‰ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฉ”์„œ๋“œ๋ฅผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋‚ด๋ถ€์—์„œ this๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‚ดํŽด๋ณธ ํ›„ handler.bind(this)์ฒ˜๋Ÿผ ํ•„์š”ํ•œ ์ปจํ…์ŠคํŠธ์˜ this ๊ฐ์ฒด๋ฅผ ํ•จ์ˆ˜์— ๋ฐ”์ธ๋“œ ํ•ด์„œ ๋„˜๊ฒจ์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ฉด ์˜๋„ํ•œ ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ํ•ด๋‹น ์ปจํ…์ŠคํŠธ์˜ this ๊ฐ์ฒด๋ฅผ ๋ฐ”์ธ๋“œ ํ•œ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

2.4. ํด๋ž˜์Šค(Class)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ ์–ธ์–ด์™€๋Š” ๋‹ฌ๋ฆฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด์„œ ํด๋ž˜์Šค์™€ ์œ ์‚ฌํ•œ ํ˜•ํƒœ์˜ API๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด์™”์Šต๋‹ˆ๋‹ค. ES5 ํ™˜๊ฒฝ์—์„œ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งˆ๋‹ค ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ES6๋ถ€ํ„ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ํด๋ž˜์Šค ๋ฌธ๋ฒ•์ด ์ถ”๊ฐ€๋˜์—ˆ๊ณ , ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๋„ ํด๋ž˜์Šค ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๊ตฌํ˜„๊ณผ ์‚ฌ์šฉ๋ฒ•๋„ ํ•œ๊ฐ€์ง€๋กœ ํ†ต์ผ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2.4.1. ๋ฌธ๋ฒ•

class SomeClass {
  static staticClassMethod() {
    // ์ •์  ๋ฉ”์„œ๋“œ
  }

  constructor() {
    // ์ƒ์„ฑ์ž ํ•จ์ˆ˜
  }

  someMethod() {
    // ํด๋ž˜์Šค ๋งค์„œ๋“œ
  }
}

const instance = new SomeClass(); 
instance.someMethod();

SomeClass.staticClassMethod();

ํด๋ž˜์Šค ๋ฌธ๋ฒ•์€ class ํ‚ค์›Œ๋“œ, ํด๋ž˜์Šค ์ด๋ฆ„, ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ธ constructor(), ๋ฉ”์„œ๋“œ๋“ค, ํด๋ž˜์Šค ์ƒ์†์„ ์œ„ํ•œ extends ํ‚ค์›Œ๋“œ, ๊ทธ๋ฆฌ๊ณ  ์ •์  ๋ฉค๋ฒ„์ธ static ํ‚ค์›Œ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” class ํ‚ค์›Œ๋“œ ๋’ค์— ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ์ ์–ด์ฃผ๊ณ , ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋ฅผ ์ƒ์†ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” extends ํ‚ค์›Œ๋“œ ๋’ค์— ์ƒ์†๋ฐ›์„ ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋„ ํ•จ์ˆ˜ ์‚ฌ์šฉ๊ณผ ๊ฐ™์ด ์„ ์–ธ์‹๊ณผ ํ‘œํ˜„์‹ ๋‘ ๊ฐ€์ง€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.4.2. ํด๋ž˜์Šค ์„ ์–ธ์‹

class SomeClass {
  //class body
}

2.4.3. ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค

ํด๋ž˜์Šค ๋ฌธ๋ฒ•์ด ์—†๋Š” ES5์—์„œ๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ๊ทธ ํ•จ์ˆ˜์˜ ํ”„๋กœํ† ํƒ€์ž… ๊ฐ์ฒด๋ฅผ ํ™•์žฅํ•ด์„œ ํด๋ž˜์Šค๋ฅผ ํ‰๋‚ด ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด์— ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ํ”„๋กœํ† ํƒ€์ž… ์ฒด์ธ์„ ์ด์šฉํ•ด์„œ ์ธ์Šคํ„ด์Šค ๋‚ด์— ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋“  ๊ฐ์ฒด์—์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ์‹ค์ˆ˜๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๋ฌธ๋ฒ•์ด ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ํ•จ์ˆ˜์ธ์ง€ ํด๋ž˜์Šค ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ธ์ง€ ํ˜ผ๋™๋˜์–ด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ์ข‹์ง€ ์•Š์€ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

ES5

function Person(name) {
  this.name = name;
}

Person.prototype.sayMyName = function() {
  console.log('My name is "' + this.name + '"');
}

var fred = new Person('fred');

ES6

class Person {
  constructor(name) {
    this.name = name
  }

  sayMyName() {
    console.log(`My name is "${this.name}"`);
  }
}

const fred = new Person('fred');

ES6 ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์–ด๋Š ์ฝ”๋“œ๊ฐ€ ํด๋ž˜์Šค์ด๊ณ  ์ƒ์„ฑ์ž ํ•จ์ˆ˜์ธ์ง€ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฉ”์„œ๋“œ๋„ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์บก์Šํ™”๋˜์–ด ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.5. ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด(Template literal)

ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ๋ฒ•์€ ๋ฐฑํ‹ฑ(`)์œผ๋กœ ๊ฐ์‹ธ์ง„ ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ๋ฌธ์ž์—ด ์กฐ์ž‘ ์‹œ์—๋Š” ๊ฐ๊ธฐ ๋ถ„๋ฆฌ๋œ ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ + ์—ฐ์‚ฐ์ž๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ์–ด์•ผ ํ–ˆ๋‹ค๋ฉด, ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์€ ๋‚ด๋ถ€์— ํ‘œํ˜„์‹์„ ๋ฐ”๋กœ ์ž‘์„ฑํ•˜์—ฌ ๋”์šฑ๋” ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด ์‚ฌ์ด์— ํ‘œํ˜„์‹์˜ ๋ฆฌํ„ด ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ํ‘œํ˜„์‹์ด ์˜ฌ ์ž๋ฆฌ์— ${expression}๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

ES5

var brandName = 'TOAST';
var productName = 'UI';

console.log('Hello ' + brandName + ' ' + productName + '!'); // 'Hello TOAST UI!';

ES6

const brandName = 'TOAST';
const productName = 'UI';

console.log(`Hello ${brandName} ${productName}!`); // 'Hello TOAST UI!';

ES6 ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒŒ๋˜๋ฉด, brandName๊ณผ productName์„ ๊ฐ๊ธฐ ํ‘œํ˜„์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„, ๋‘˜์„ ํ•ฉ์นœ ํ…œํ”Œ๋ฆฟ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„์‹์œผ๋กœ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฐœํ–‰ ๋ฌธ์ž๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ํ•œ ์ค„ ์ด์ƒ์˜ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ์กด ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์€ ๋‘ ์ค„ ์ด์ƒ์˜ ๋ฌธ์ž์—ด์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ๊ฐœํ–‰ ๋ฌธ์ž๊ฐ€ ๋ฌธ์ž์—ด ๋‚ด์— ์ž๋™์œผ๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

 

ES5

var howToDripCoffee = '1. ๋ฌผ์„ ๋“์ธ๋‹ค.\n2. ์ปคํ”ผ ์›๋‘๋ฅผ ๊ฐ„๋‹ค.\n3. ๊ฐˆ๋ฆฐ ์›๋‘๋ฅผ ์ปคํ”ผ ํ•„ํ„ฐ ์œ„์— ๋‘๊ณ , ํ•„ํ„ฐ๋ฅผ ์ปต์— ์˜ฌ๋ ค๋†“๋Š”๋‹ค.\n4. ๋“์ธ๋ฌผ์„ ์ฒœ์ฒœํžˆ ํ•„ํ„ฐ ์œ„๋กœ ํ˜๋ ค๋‚ด๋ฆฐ๋‹ค.';

ES6

const howToDripCoffee = `1. ๋ฌผ์„ ๋“์ธ๋‹ค.
2. ์ปคํ”ผ ์›๋‘๋ฅผ ๊ฐ„๋‹ค.
3. ๊ฐˆ๋ฆฐ ์›๋‘๋ฅผ ์ปคํ”ผ ํ•„ํ„ฐ ์œ„์— ๋‘๊ณ , ํ•„ํ„ฐ๋ฅผ ์ปต์— ์˜ฌ๋ ค๋†“๋Š”๋‹ค.
4. ๋“์ธ๋ฌผ์„ ์ฒœ์ฒœํžˆ ํ•„ํ„ฐ ์œ„๋กœ ํ˜๋ ค๋‚ด๋ฆฐ๋‹ค.`;

ES5 ๋ฒ„์ „์˜ ์˜ˆ์ œ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„์ด ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.6. ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง(Destructuring)

JavaScript ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ๊ฐ์ฒด๋ฅผ ํ•จ์ˆ˜๋ผ๋ฆฌ ์ฃผ๊ณ ๋ฐ›๋Š” ์ƒํ™ฉ์ด ์•„์ฃผ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ „๋‹ฌ๋ฐ›์€ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๋ ค๋ฉด ๊ฐ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ„๋„์˜ ๋ณ€์ˆ˜๋กœ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ ํ”„๋กœํผํ‹ฐ๋งˆ๋‹ค ๋…๋ฆฝ๋œ ํ• ๋‹น๋ฌธ์„ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ฌธ๋ฒ•์ด ์ถ”๊ฐ€๋˜์–ด ๋ณ€์ˆ˜ ์„ ์–ธ์ด ํ›จ์”ฌ ๋” ํŽธํ•ด์กŒ๊ณ , ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

2.6.1. ๋ณ€์ˆ˜ ์„ ์–ธ

๋จผ์ € ๋ณ€์ˆ˜์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‰ฝ๊ฒŒ ์„ ์–ธํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ๊ฐ์ฒด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง์€ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ช…์„ {, }์•ˆ์— ๋‚˜์—ดํ•˜๋ฉด ๊ฐ ํ”„๋กœํผํ‹ฐ์˜ ์ด๋ฆ„์œผ๋กœ ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ์ž๋™์œผ๋กœ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง๋„ ๋น„์Šทํ•œ๋ฐ [, ] ์•ˆ์— ๋‚˜์—ดํ•˜๋Š” ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์— ๋งž๋Š” ์ธ๋ฑ์Šค์˜ ๋ฐฐ์—ด ์š”์†Œ๊ฐ€ ๋ณ€์ˆ˜์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

 

ES5

function printUserInformation(data) {
  var name = data.name;
  var age = data.age;
  var hobby = data.hobbies;
  var firstHobby = hobbies[0];

  console.log('์ด๋ฆ„: ' + name);
  console.log('๋‚˜์ด: ' + age);
  console.log('๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ทจ๋ฏธ: ' + firstHobby);
}

ES6

function printUserInformation(data) {
  const {name, age, gender, hobbies} = data;
  const [firstHobby] = hobbies; 

  console.log(`์ด๋ฆ„: ${name}`);
  console.log(`๋‚˜์ด: ${age}`);
  console.log(`๊ฐ€์žฅ ์ข‹์•„ํ•˜๋Š” ์ทจ๋ฏธ: ${firstHobby}`);
}

๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง์œผ๋กœ []์ ‘๊ทผ์ž ์‚ฌ์šฉ์„ ํ•˜์ง€ ์•Š๊ณ ๋„ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง์œผ๋กœ ๋ฐ˜๋ณต๋˜๋Š” var * = data.*๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  ํ•œ ์ค„์งœ๋ฆฌ ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค.

2.6.2. ํŒŒ๋ผ๋ฏธํ„ฐ ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ์„ ์–ธ

ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์€ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” ๋ณ„๋„์˜ ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ ์—†์ด ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์œ„์น˜์— ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์„ ์–ธํ•  ๋ณ€์ˆ˜์˜ ์ด๋ฆ„์€ ๊ธฐ์กด ๊ฐ์ฒด์— ์„ ์–ธ๋œ ์ด๋ฆ„ ๋ง๊ณ  ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ๋„ ์„ ์–ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

ES5

function printError(error) {
  var errorCode = error.errorCode;
  var msg = error.errorMessage;

  console.log('์—๋Ÿฌ์ฝ”๋“œ: ' + errorCode);
  console.log('๋ฉ”์‹œ์ง€:' + msg);
}

ES6

function printError({
  errorCode,
  errorMessage: msg
}) { 
  console.log(`์—๋Ÿฌ์ฝ”๋“œ: ${errorCode}`);
  console.log(`๋ฉ”์‹œ์ง€: ${msg}`);
}

๋จผ์ € ES5 ์˜ˆ์ œ์˜ var * = data.*๊ฐ™์€ ๋ฐ˜๋ณต์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ถ€๋ถ„์ด ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์ฒ˜๋Ÿผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  printError()ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋งํ•ด์„œ ๋ณ„๋„์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ errorMessage๋ฅผ :๋กœ ์—ฐ๊ฒฐํ•ด์„œ ๋ณ€์ˆ˜๋ช…์„ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.7. ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋””ํดํŠธ ๊ฐ’ ์„ค์ •

2.7.1. ๋””ํดํŠธ๊ฐ’ ํ• ๋‹น

ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋””ํดํŠธ ๊ฐ’ ์„ค์ •์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์—์„œ ์ง€์›ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋””ํดํŠธ ๊ฐ’ ์„ค์ •์ด๋ž€ ํ•จ์ˆ˜์˜ ์˜ค๋™์ž‘์„ ๋ง‰๊ธฐ ์œ„ํ•ด ํŠน์ • ํƒ€์ž… ํ˜น์€ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ undefined๋กœ ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ, undefined๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ES5์—์„œ๋Š” ๋””ํดํŠธ ๊ฐ’์„ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด if๋ฌธ์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ undefined์ธ์ง€ ํ™•์ธํ•œ ๋’ค, ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด undefined๋ผ๋ฉด ๋Œ€์ฒดํ•  ๊ฐ’์„ ํ•ด๋‹น ๋งค๊ฐœ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์™”์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ES6์—์„œ๋Š” ๋”์šฑ๋” ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ES5

function sayName(name) {
  if (!name) {
    name = 'World';
  }

  console.log('Hello, ' + name + '!');
}

sayName(); // "Hello, World!"

ES6

const sayName = (name = 'World') => {
  console.log(`Hello, ${name}!`);
}

sayName(); // "Hello, World!"

2.8. Rest ํŒŒ๋ผ๋ฏธํ„ฐ, Spread ํ‘œํ˜„์‹

ES6๋Š” ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์ด๋‚˜ ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์˜ ์‚ฌ์šฉ์„ฑ์ด ๋Œ€ํญ ์ข‹์•„์กŒ์Šต๋‹ˆ๋‹ค. Rest ํŒŒ๋ผ๋ฏธํ„ฐ๋‚˜ Spread ํ‘œํ˜„ ์‹๋„ ๊ทธ ์ค‘์— ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

2.8.1. Spread ํ‘œํ˜„์‹

๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋‚ด๋ถ€์— ...ids ์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ์œ„์น˜์— ids์˜ ๊ฐ ๋ฐฐ์—ด ์š”์†Œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ’€์–ด๋ƒ…๋‹ˆ๋‹ค. Spread ํ‘œํ˜„์‹์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋‚˜ ๋ฐฐ์—ด ๋ฐ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด ๋ณต์‚ฌ๋‚˜ ๋ถˆ๋ณ€(immutable)๊ฐ์ฒด ์ƒ์„ฑ๋„ ์†์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ... ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ํ’€์–ด๋‚ผ ๊ฐ์ฒด๋ฅผ, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋’ค์— ์ถ”๊ฐ€/๋ณ€๊ฒฝ๋  ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2.8.2. ๋ฐฐ์—ด์„ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ

๋ฐฐ์—ด์„ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ Spread ํ‘œํ˜„์‹์œผ๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ES5

var friends = ['Jack', 'Jill', 'Tom'];

textToFriends(friends[0], friends[1], friends[2]);

ES6

const friends = ['Jack', 'Jill', 'Tom'];

textToFriends(...friends);

2.8.3. ๋ฐฐ์—ด ๋ฐ ๊ฐ์ฒด ํ™•์žฅ

์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋‹ค๋ฅธ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์— ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์— ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋“ค์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋„ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ, Spread ํ‘œํ˜„์‹์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋กœ ์ธํ•ด ์ค‘๋ณต๋˜๋Š” ํ‚ค๊ฐ€ ์ƒ๊ธด๋‹ค๋ฉด ๊ฐ€์žฅ ๋‚˜์ค‘์— ์ž‘์„ฑ๋œ ํ‘œํ˜„์‹์ด ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

 

ES5

var friends = ['Jack', 'Jill', 'Tom'];
var anotherFriedns = [friends[0], friends[1], friends[2], 'Kim'];

var drinks = {
  coffee: 'coffee',
  juice: 'orange juice'
};
var newDrinks = {
  coffee: drinks.coffee,
  juice: 'tomato juice',
  water: 'water'
};

ES6

const friends = ['Jack', 'Jill', 'Tom'];
const anotherFriedns = [...friends, 'Kim'];

const drinks = {
  coffee: 'coffee',
  juice: 'orange juice'
};
const newDrinks = {
  ...drinks,
  juice: 'tomato juice',
  water: 'water'
};

2.8.4. Rest ํŒŒ๋ผ๋ฏธํ„ฐ

ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€๋ณ€์ ์ธ ํ•จ์ˆ˜์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด arguments ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ ‘๊ทผํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ someFunction(target, ...params)ํ˜•ํƒœ๋กœ Rest ํŒŒ๋ผ๋ฏธํ„ฐ ์—ฐ์‚ฐ์ž๋ฅผ ์ž‘์„ฑํ•˜๋ฉด target ๋’ค์— ์˜ค๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ๋ชจ๋‘ params ๋ฐฐ์—ด๋กœ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ธ์ˆ˜๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•ž์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค๋งŒ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ES5

function textToFriends() {
  var message = arguments[0];
  var friends = [].slice.call(arguments, 1); // argunemts 2๋ฒˆ์งธ ์š”์†Œ๋ถ€ํ„ฐ ์นœ๊ตฌ๋“ค ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค๊ธฐ.

  console.log(message, friends);
}

ES6

function textToFriends(message, ...friends) {
  console.log(message, friends);
}

ES5 ์ฝ”๋“œ์ฒ˜๋Ÿผ arguments ๊ฐ์ฒด๋ฅผ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ๋ณ€์ˆ˜์™€ ๋ฐฐ์—ด๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.9. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ(Generator)

ES6์˜ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” Generator ์ƒ์„ฑ์ž๋‚˜ function* ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋Š” ์ฝ”๋“œ์˜ ์ง„ํ–‰ ํ๋ฆ„์—์„œ ์ž ์‹œ ๋น ์ ธ๋‚˜๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ฌ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

2.9.1. ๋ฌธ๋ฒ•

function* gen() {
  yield 1;
  yield 2;
  yield 3;
  yield 4;
}

const g = gen();

์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด yield๋ฅผ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋Œ€๊ธฐํ•˜๋ฉฐ ์ œ์–ด๊ฐ€ ๋‹ค์‹œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ ๋ผ์ธ์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋ฉˆ์ถฐ์žˆ๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ์žฌ๊ฐœํ•˜๋ ค๋ฉด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ฐ์ฒด์˜ g.next() ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์˜ g.next()๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋ฉˆ์ถฐ์žˆ๋˜ ์œ„์น˜์˜ yield ์—์„œ๋ถ€ํ„ฐ ๋‹ค์Œ yield๋ฌธ์„ ๋งŒ๋‚  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์ œ์–ด๊ฐ€ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ์—์„œ ๋น ์ ธ๋‚˜์™€ g.next()๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ ๋ผ์ธ์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. g.next()์˜ ๋ฆฌํ„ด ๊ฐ’์€ ๊ฐ์ฒด์ด๋ฉฐ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ˆ˜ํ–‰๋˜์—ˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๋ถˆ๋ฆฌ์–ธ ๊ฐ’ done๊ณผ yield๋ฌธ์˜ ์ˆ˜ํ–‰ ๊ฒฐ๊ด๊ฐ’์ธ value ํ”„๋กœํผํ‹ฐ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

function* gen() {
  yield 1;
  yield 2;
  yield 3;
  yield 4;
}

const g = gen();

console.log(g.next().value); // 1
console.log(g.next().value); // 2
console.log(g.next().value); // 3
console.log(g.next().value); // 4
console.log(g.next().value); // undefined

์œ„ ์˜ˆ์ œ์—์„œ ๋งˆ์ง€๋ง‰ g.next().value๊ฐ€ undefined์ธ ์ด์œ ๋Š” ๋ชจ๋“  yield ๊ตฌ๋ฌธ์ด ์ˆ˜ํ–‰๋˜์–ด ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
Reference: MDN - Generator, function*

2.10. ํ”„๋กœ๋ฏธ์Šค(Promise)

ํ”„๋กœ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ถ”์ƒํ™”๋œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๊ฑฐ๋‚˜ ์‹คํŒจ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๊ณ  ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๊ฒฐ๊ด๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„ฑ๊ณต ์‹œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜, ์‹คํŒจ ์‹œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•ด์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์ด์šฉํ•˜๋ฉด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค๋กœ ์—ฌ๋Ÿฌ ๊ฒน ๊ฐ์‹ธ์ง„ ์ฝœ๋ฐฑ ์ง€์˜ฅ ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.10.1. ๋ฌธ๋ฒ•

const p = new Promise((resolve, reject) => {
  // ๋น„๋™๊ธฐ๊ฐ€ ์ฒ˜๋ฆฌ ํ•„์š”ํ•œ ์ฝ”๋“œ
});

p.then(onFulfilled, onRejected).catch(errorCallback);

ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ์ž์— ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์‹คํ–‰์ž(executor)๋ผ๊ณ  ํ•˜๋ฉฐ, ์‹คํ–‰์ž๋Š” ํ”„๋กœ๋ฏธ์Šค ์ƒ์„ฑ์ž๊ฐ€ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ์ „์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰์ž์˜ ์ธ์ž์ธ resolve์™€ reject๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ๊ตฌํ˜„์— ์˜ํ•ด ์‹คํ–‰์ž์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜์ด๋ฉฐ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•˜๋Š” ํ•จ์ˆ˜์ด์ž…๋‹ˆ. ์ด ๋‘ ๊ฐœ์˜ ์ธ์ž๋ฅผ ์ด์šฉํ•ด์„œ ์‹คํ–‰์ž ๋‚ด๋ถ€์˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ํŒ๋‹จํ•˜๊ณ , resolve๋‚˜ rejectํ•จ์ˆ˜์— ํ›„์† ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์ „๋‹ฌํ•  ๊ฐ’์„ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด์„œ ์‹คํ–‰ํ•˜์—ฌ ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์™„๋ฃŒ๋˜๋„๋ก ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์‹คํ–‰์ž ๋‚ด๋ถ€์—์„œ resolve๊ฐ€ ์‹คํ–‰๋˜๋ฉด then ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์ธ onFulfilled๊ฐ€ ๋ฐ›๊ฒŒ ๋˜๊ณ , ๋ฐ˜๋Œ€๋กœ reject๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋‘ ๋ฒˆ์งธ ์ธ์ž onRejected ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

const checkNumIsExceedTen = new Promise((resolve, reject) => {
  setTimeout(() => {
    const num = getRandomNumberFromServer();

    if(Number.isNaN(num)) {
      throw new Error('Value that from server must be a "number" type.');
    }

    if (num > 10) {
      resolve(num);
    } else {
      reject(num);
    }
  });
});

checkNumIsExceedTen
  .then((num) => {
    console.log(`'num' is ${num}. It is exceed 10.`);
  }, (num) => {
    console.log(`'num' is ${num}. It is not exceed 10.`);
  })
  .catch((error) => {
    console.log(error.message);
  });

์˜ˆ์ œ์˜ ์ฝ”๋“œ๋Š” ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜จ num๋ณ€์ˆ˜์˜ ๊ฐ’์ด 10์„ ์ดˆ๊ณผํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ ์ข…๋ฃŒ๋œ ํ›„ ์‹คํ–‰ํ•  ์ฝœ๋ฐฑ๋“ค์„ then์œผ๋กœ ๋“ฑ๋กํ–ˆ๊ณ , ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅํ•  ์ฝœ๋ฐฑ๋„ catch๋ฅผ ์ด์šฉํ•ด์„œ ๋“ฑ๋กํ–ˆ์Šต๋‹ˆ๋‹ค.

2.10.2. ์ฝœ๋ฐฑ ํ”ผ๋ผ๋ฏธ๋“œ ๊ฐœ์„ ํ•˜๊ธฐ

๊ธฐ์กด ES5์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ณดํ†ต ์ฝœ๋ฐฑ ์ง€์˜ฅ, ์ฝœ๋ฐฑ ํ”ผ๋ผ๋ฏธ๋“œ๋ผ๊ณ  ํ•˜๋Š” ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ํ˜•ํƒœ๋กœ ๊ณ„์† ์ƒ์„ฑํ•˜๊ณ  ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์žฅ ์•ˆ์ชฝ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์—์„œ ์ „๋‹ฌ๋ฐ›์•„ ์‹คํ–‰์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

 

ES5

doSomething(function(result) {
  doSomethingElse(result, function(newResult) {
    doThirdThing(newResult, function(finalResult) {
      console.log('Got the final result: ' + finalResult);
    }, failureCallback);
  }, failureCallback);
}, failureCallback);

ES6

doSomethingPromise
  .then((result) => doSomethingElse(result))
  .then((newResult) => doThirdThing(newResult))
  .then((finalResult) => console.log('Got the final result: ' + finalResult))
  .catch(failureCallback);

๊ฒน๊ฒน์ด ์Œ“์—ฌ์žˆ๋˜ ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋‘ ์ฝ”๋“œ์˜ ์ฐจ์ด๋ฅผ ๋ณด์ž. ์ฝœ๋ฐฑ ํ”ผ๋ผ๋ฏธ๋“œ ์ฝ”๋“œ์—์„œ๋Š” ํ•จ์ˆ˜๋งˆ๋‹ค ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ฝœ๋ฐฑ์„ ์ „๋‹ฌํ–ˆ์—ˆ๋‹ค๋ฉด, ํ”„๋กœ๋ฏธ์Šค ์ฝ”๋“œ์—์„œ๋Š” ํ•œ ๋ฒˆ์˜ catch๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ฒน๊ฒน์ด ์Œ“์—ฌ๊ฐ€๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ ๋น„๊ตํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์—ฐ๊ฒฐํ•ด์„œ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2.10.3. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌํ•˜๊ธฐ

ํ”„๋กœ๋ฏธ์Šค๋Š” ๋‹จ์ผ ๋น„๋™๊ธฐ ์š”์ฒญ์„ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋น„๋™๊ธฐ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”„๋กœ๋ฏธ์Šค ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ Promise.all, Promise.race ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด๋“ค์ด ์™„๋ฃŒ๋˜๋Š” ์ƒํƒœ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ๋Š” ๋ฐฐ์—ด๊ฐ™์ด ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ(iterable) ๊ฐ์ฒด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. Promise.all์€ ๋ชจ๋“  ํ”„๋กœ๋ฏธ์Šค๊ฐ€ resolve๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๊ณ , Promise.race๋Š” ๊ฐ€์žฅ ๋จผ์ € resolve๋˜๋Š” ํ”„๋กœ๋ฏธ์Šค์˜ ์ดํ–‰ ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ”„๋กœ๋ฏธ์Šค๋Š” ์ˆœ์ฐจ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("foo");
  }, 100);
}); 

Promise.all([p1, p2, p3]).then(values => { 
  console.log(values); // [3, 1337, "foo"] 
});

Promise.race([p1, p2, p3]).then(value => { 
  console.log(value); // 3
});

์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์˜ ์ธ์ž๊ฐ€ ๋ชจ๋‘ resolve๋˜๋ฉด resolve๋œ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ํ•˜๋‚˜๋ผ๋„ reject๋˜๋ฉด ์ฒซ๋ฒˆ์งธ๋กœ reject๋œ ์ด์œ ๋ฅผ ์‚ฌ์šฉํ•ด์„œ rejectํ”„๋กœ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

2.11. async/await

async ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋”์šฑ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. async ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๋ฏธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋™๊ธฐ ํ•จ์ˆ˜ ์‹คํ–‰๊ณผ ๋น„์Šทํ•œ ๋ชจ์Šต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. async ํ‚ค์›Œ๋“œ๊ฐ€ ์•ž์— ๋ถ™์€ ํ•จ์ˆ˜์„ ์–ธ๋ฌธ์˜ ํ•จ์ˆ˜ ๋ณธ๋ฌธ์—๋Š” await ์‹์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด await ์‹์€ async ํ•จ์ˆ˜ ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ํ‘œํ˜„์‹์— ์ „๋‹ฌ๋œ ํ”„๋กœ๋ฏธ์Šค์˜ ํ•ด๊ฒฐ์„ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ async ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ์žฌ๊ฐœํ•˜๊ณ , ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ๋ชจ๋‘ ์™„๋ฃŒ๋œ ๋’ค์— ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  await ์‹์€ async ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฌธ๋ฒ• ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. async ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์€ ํ”„๋กœ๋ฏธ์Šค์ด๋ฉฐ, returnValue๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์•”๋ฌต์ ์œผ๋กœ Promise.resolve(returnValue) ํ˜•ํƒœ๋กœ ๊ฐ์‹ธ์ ธ์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋ฏธ์Šค์— catch๋กœ ์ฒ˜๋ฆฌํ•˜๋˜ ์—๋Ÿฌ๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์—์„œ์˜ try/catch๋ฌธ์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๋ฏธ์Šค์˜ reject์— ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์ด ์—๋Ÿฌ ๊ฐ์ฒด๋กœ ๋„˜์–ด์˜ต๋‹ˆ๋‹ค.

2.11.1. ํ”„๋กœ๋ฏธ์Šค

function fetchMemberNames(groupId) {
  return getMemberGroup(groupId)
    .then(memberGroup => getMembers(memberGroup))
    .then(members => members.map(({name}) => name))
    .catch(err => {
      showNotify(err.message);
    });
}

fetchMemberNames('gid-11')
  .then(names => {
    if (names) {
      addMembers(names);
    }
  });

2.11.2. async ํ•จ์ˆ˜

async function fetchMemberNames(groupId) {
  try {
    const memberGroup = await getMemberGroup(groupId);
    const members = await getMembers(memberGroup);

    return members.map(({name}) => name);
  } catch (err) {
    showNotify(err.message);
  }
}

fetchMemberNames('gid-11')
  .then(members => {
    if (members) {
      addMembers(members);
    }
  });

2.12. ๋ชจ๋“ˆ(ES Module)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋„ ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ES5์—์„œ๋Š” Webpack, Rollup, Parcel ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ๋‚˜ Babel ๊ฐ™์€ ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ES6์—์„œ๋Š” ๋ชจ๋“ˆ์„ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋ช…์„ธ๋ฅผ ๊ตฌํ˜„ํ•œ ๋ชจ๋˜ ๋ธŒ๋ผ์šฐ์ €๋“ค๋ถ€ํ„ฐ๋Š” import, export๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ชจ๋“ˆ์€ .js ํ™•์žฅ์ž๋กœ ๋งŒ๋“ค์–ด์ง„ ํŒŒ์ผ์„ ๋œปํ•œํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋‚ด๋ถ€์—์„œ ๋ณ„๋„์˜ module ๋“ฑ์˜ ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ชจ๋“ˆ์˜ ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ strict ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ์•ˆ์—์„œ๋Š” import, export ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐœ์˜ ๋ชจ๋“ˆ ์•ˆ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜ ๋“ฑ์€ ๊ทธ ๋ชจ๋“ˆ ๋‚ด๋ถ€ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ๋ชจ๋“ˆ์˜ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ๋ฐ”๋กœ export๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. export๋ฌธ์„ ํ†ตํ•ด ํ•จ์ˆ˜, ํด๋ž˜์Šค, ๋ณ€์ˆ˜ ๋“ค์„ ๋ชจ๋“ˆ ์™ธ๋ถ€๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ export๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ์™ธ๋ถ€๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ Named export, Default export ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2.12.1. Named export

students.js

export const student = 'Park';
export const student2 = 'Ted';

const student3 = 'Abby';
export {student3};

Named export๋Š” ํ•œ ํŒŒ์ผ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Named export๋ฅผ ํ†ตํ•ด ๋‚ด๋ณด๋‚ธ ๊ฒƒ ๋“ค์€ ์ถ”ํ›„ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ๋‚ด๋ณด๋‚ผ ๋•Œ์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ import ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

2.12.2. Default export

studentJack.js

export default 'Jack'

๋ฐ˜๋ฉด์— Default export๋Š” ํ•œ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋‹น ํ•œ ๊ฐœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  export default์˜ ๋’ค์—๋Š” ํ‘œํ˜„์‹๋งŒ ํ—ˆ์šฉ๋˜๋ฏ€๋กœ var, let, const๋“ฑ์˜ ํ‚ค์›Œ๋“œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋‚ด๋ณด๋‚ธ ๊ฐ์ฒด๋“ค์€ ๋ชจ๋“ˆ๋“ค์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ง€๊ธˆ๋ถ€ํ„ฐ๋Š” ๋ชจ๋“ˆ์—์„œ export ํ•œ ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ ธ์˜ค๋Š” import๋ฌธ์„ ์‚ดํŽด๋ด…์‹œ๋‹ค.

2.12.3. Named export ๋œ ๊ฐ์ฒด ์‚ฌ์šฉํ•˜๊ธฐ

import {student, student2, student3} from 'students.js';

console.log(student);   // "Park";
console.log(student2);  // "Ted";
console.log(student3);  // "Abby";

์œ„์ฒ˜๋Ÿผ Named export ๋œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š” ๊ฐ ๊ฐ์ฒด์˜ ์ด๋ฆ„๋“ค์„ {, }๋กœ ๊ฐ์‹ธ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ€์ ธ์˜ฌ ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์„œ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”? ๋ณ„๋„์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ๊ฐ์ฒด ์ด๋ฆ„ ๋’ค์— as [[๋ฐ”๊ฟ€ ๋ณ€์ˆ˜๋ช…]] ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์„œ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import {student as park, student2 as ted, student3 as abby} from 'students.js';

const student = 'Kim';

console.log(student); // "Kim"
console.log(park);    // "Park"
console.log(ted);     // "Ted"
console.log(abby);    // "Abby"

์ด ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋ช…๊ณผ ๊ฐ™์€ ์ด๋ฆ„์˜ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ, ์ด๋ ‡๊ฒŒ Named export ๋œ ๊ฐ์ฒด๊ฐ€ ๋งŽ์„ ๋•Œ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์œ„ ์˜ˆ์ œ ์ฒ˜๋Ÿผ ๊ฐ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์”ฉ ์—ด๊ฑฐํ•ด์•ผ ํ• ๊นŒ์š”? ์•„๋‹™๋‹ˆ๋‹ค. *์„ ์ด์šฉํ•ด์„œ ํ•œ๊บผ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

import * as students from 'students.js';

console.log(students.student);  // "Park"
console.log(students.student2); // "Ted"
console.log(students.student3); // "Abby"

์ด๋ฒˆ์—๋„ * ๋ฌธ๋ฒ•์œผ๋กœ students.js ํŒŒ์ผ ๋‚ด๋ถ€์˜ ๋ชจ๋“  Named export ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด์ฃผ๊ณ , ๋ฐ”๋กœ ๋’ค์— as [[๋ณ€์ˆ˜๋ช…]] ํ˜•ํƒœ๋กœ ํ•ด๋‹น ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋ณ€์ˆ˜๋ช…์„ ์ •ํ•ฉ๋‹ˆ๋‹ค.

2.12.4. Default export ๋œ ๊ฐ์ฒด ์‚ฌ์šฉํ•˜๊ธฐ

import jack from 'studentJack';

console.log(jack); // "Jack"

์‚ฌ์šฉ๋ฒ•์€ Named export์™€ ๋น„์Šทํ•˜์ง€๋งŒ {, }๋กœ ๊ฐ์‹ธ์ง€ ์•Š๊ณ  ๋ณ€์ˆ˜๋ช…์„ import๋ฌธ ๋’ค์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ, Default export ๋œ ๊ฐ์ฒด๋Š” ํŒŒ์ผ๋งˆ๋‹ค ์œ ์ผํ•˜๋ฏ€๋กœ as ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”์„œ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. import ํ‚ค์›Œ๋“œ ๋’ค์— ์‚ฌ์šฉํ•œ ์ด๋ฆ„์ด ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜๋ช…์ด ๋ฉ๋‹ˆ๋‹ค.

2.12.5. ๋‘ ๋ฐฉ๋ฒ• ๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ

์•ž์„œ ์†Œ๊ฐœํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ• Named export์™€ Default export๋Š” export์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋„ ํ•œ ๋ฒˆ์— ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ students.js ํŒŒ์ผ์—์„œ๋Š” ๊ฐ์ฒด๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  school.js ํŒŒ์ผ์—์„œ๋Š” ๊ทธ ๊ฐ์ฒด๋“ค์„ ๊ฐ€์ ธ์™€ ๋ด…์‹œ๋‹ค.

 

students.js

const jack = 'Jack';

export default jack

const student = 'Park';
const student2 = 'Ted';
const student3 = 'Abby';

export {student, student2, student3};

school.js

import jack, {student, student2, student3} from 'students';

console.log(jack);    // "Jack"
console.log(student); // "Park"
console.log(student2);// "Ted"
console.log(student3);// "Abby"

3. Reference

 

ES5 to ES6+

ECMAScript(ES5๋‚˜ ES2015์˜ ES๋Š” ECMAScript์˜ ์ค„์ž„๋ง์ด๋‹ค.)๋Š” Ecma ์ธํ„ฐ๋‚ด์…”๋„์—์„œ ์ •์˜ํ•œ ECMA-262 ๊ธฐ์ˆ  ๊ทœ๊ฒฉ์— ์ •์˜๋œ ํ‘œ์ค€ ์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ด๋‹ค. ECMAScript๋Š” 1997๋…„์— 1ํŒ์ด ๋ฐฐํฌ๋˜๊ณ  ๊ทธ ๋’ค๋กœ ๋งค๋…„

ui.toast.com

 

1. ES(ECMA Script)2. ES6์—์„œ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ฌธ๋ฒ•, ๊ธฐ๋Šฅ๋“ค2.1. ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•œ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ง• ์ง€์›2.2. let, const์˜ ๋“ฑ์žฅ2.2.1. ๋ธ”๋ก ์Šค์ฝ”ํ”„ ์ง€์›2.2.2. ES5 ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…(Hoisting)์˜ ๋ฌธ์ œ์  ๊ฐœ์„ 2.2.3. let๊ณผ const์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ์ฐจ์ด์ 2.3. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(Arrow function)2.4. ํด๋ž˜์Šค(Class)2.4.1. ๋ฌธ๋ฒ•2.4.2. ํด๋ž˜์Šค ์„ ์–ธ์‹2.4.3. ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜ ํด๋ž˜์Šค2.5. ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด(Template literal)2.6. ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง(Destructuring)2.6.1. ๋ณ€์ˆ˜ ์„ ์–ธ2.6.2. ํŒŒ๋ผ๋ฏธํ„ฐ ๋‚ด๋ถ€ ๋ณ€์ˆ˜ ์„ ์–ธ2.7. ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋””ํดํŠธ ๊ฐ’ ์„ค์ •2.7.1. ๋””ํดํŠธ๊ฐ’ ํ• ๋‹น2.8. Rest ํŒŒ๋ผ๋ฏธํ„ฐ, Spread ํ‘œํ˜„์‹2.8.1. Spread ํ‘œํ˜„์‹2.8.2. ๋ฐฐ์—ด์„ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ2.8.3. ๋ฐฐ์—ด ๋ฐ ๊ฐ์ฒด ํ™•์žฅ2.8.4. Rest ํŒŒ๋ผ๋ฏธํ„ฐ2.9. ์ œ๋„ˆ๋ ˆ์ดํ„ฐ(Generator)2.9.1. ๋ฌธ๋ฒ•2.10. ํ”„๋กœ๋ฏธ์Šค(Promise)2.10.1. ๋ฌธ๋ฒ•2.10.2. ์ฝœ๋ฐฑ ํ”ผ๋ผ๋ฏธ๋“œ ๊ฐœ์„ ํ•˜๊ธฐ2.10.3. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ๋ฏธ์Šค ์ฒ˜๋ฆฌํ•˜๊ธฐ2.11. async/await2.11.1. ํ”„๋กœ๋ฏธ์Šค2.11.2. async ํ•จ์ˆ˜2.12. ๋ชจ๋“ˆ(ES Module)2.12.1. Named export2.12.2. Default export2.12.3. Named export ๋œ ๊ฐ์ฒด ์‚ฌ์šฉํ•˜๊ธฐ2.12.4. Default export ๋œ ๊ฐ์ฒด ์‚ฌ์šฉํ•˜๊ธฐ2.12.5. ๋‘ ๋ฐฉ๋ฒ• ๋‹ค ์‚ฌ์šฉํ•˜๊ธฐ3. Reference
๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค!