[Javasciprt] ES6์‹œ๋Œ€์˜ JavaScript

์•ˆ๋…•ํ•˜์„ธ์š”. ์‚ฌ์›์‚ฌ์—…๋ถ€์˜ ๋งˆ๋ฃจ์•ผ๋งˆ@h13i32maru์ž…๋‹ˆ๋‹ค. ์ตœ๊ทผ์˜ Web ํ”„๋ก ํŠธ์—”๋“œ์˜ ๋ณ€ํ™”๋Š” ๋งค์šฐ ๊ฒฉ๋ ฌํ•ด์„œ, ์กฐ๊ธˆ ๋ˆˆ์„ ๋• ์‚ฌ์ด์— ์ ์  ์ƒˆ๋กœ์šด ๊ฒƒ์ด ๋‚˜์˜ค๊ณ  ์žˆ๋”๋ผ๊ตฌ์š”. ๊ทธ๋Ÿฐ ๊ฒฉ๋ ฌํ•œ ๋ณ€ํ™”์ค‘ ํ•˜๋‚˜๊ฐ€ ES6์ด๋ผ๋Š” ์ฐจ์„ธ๋Œ€ JavaScript์˜ ์‚ฌ์–‘์ž…๋‹ˆ๋‹ค. ์ด ES6๋Š” ํ˜„์žฌ ์žฌ์ •์ค‘์œผ๋กœ ์ง‘ํ•„์‹œ์ ์—์„œ๋Š” Draft Rev31์ด ๊ณต๊ฐœ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

JavaScript๋Š” ECMAScript(ECMA262)๋ผ๋Š” ์‚ฌ์–‘์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋˜ํ•œ Web ๋ธŒ๋ผ์šฐ์ €๋Š” ECMAScript 5.1th Edition์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ JavaScript์‹คํ–‰ ์—”์ง„์„ ํƒ‘์žฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋ฒ„์ „์ธ ECMAScript 6th Edition์ด ํ˜„์žฌ ์žฌ์ •์ค‘์œผ๋กœ, ์•ฝ์นญ์œผ๋กœ ES6์ด๋ผ๋Š” ๋ช…์นญ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฒˆ์—”, ๋‹ค๋ฅธ ์–ธ์–ด์— ์žˆ๊ณ  JavaScript์—๋„ ์žˆ์œผ๋ฉด ํ•˜๋Š” ๊ธฐ๋Šฅ๊ณผ, JavaScript์—์„œ ์ž˜ ๋‚˜์˜ค๋Š” ํŒจํ„ด์„ ํ†ตํ•ฉ์ ์œผ๋กœ ์ ์„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Class

JavaScript๋Š” โ€œํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ OOPโ€๋ผ ๋ถˆ๋ฆฌ๊ณ  ์žˆ๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ, Java๋‚˜ Ruby๋“ฑ์˜ โ€œํด๋ž˜์Šค ๊ธฐ๋ฐ˜์˜ OOPโ€์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœํ† ํƒ€์ž… ๋ฒ ์ด์Šค์˜ ๊ธฐ๋Šฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์—ฌํƒœ๊นŒ์ง€ ๋ณ„๋กœ ์—†์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๊ฐ€์งœ ํด๋ž˜์Šค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋˜๊ฐ€, ํด๋ž˜์Šค๋ฅผ ์‹คํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ ๋Š” ๊ฒƒ์ด ๋งŽ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ npm์—์„œ class๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋งŽ์€ ํŒจํ‚ค์ง€๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ๋งŒ ์ƒ๊ฐํ•ด๋„ ์•Œ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ES6์—์„œ๋Š” ํด๋ž˜์Šค ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•ด์„œ, ํด๋ž˜์Šค๋ฅผ ๊ฐ„๋‹จํžˆ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

// ES5
'use strict';

function User(name) {
  this._name = name;
}

User.prototype = Object.create(null, {
  constructor: {
    value: User,
  },

  say: {
    value: function () {
      return 'My name is ' + this._name;
    },
  },
});

function Admin(name) {
  User.apply(this, arguments);
}

Admin.prototype = Object.create(User.prototype, {
  constructor: {
    value: Admin,
  },

  say: {
    value: function () {
      var superClassPrototype = Object.getPrototypeOf(this.constructor.prototype);
      return '[Administrator] ' + superClassPrototype.say.call(this);
    },
  },
});

var user = new User('Alice');
console.log(user.say()); // My name is Alice

var admin = new Admin('Bob');
console.log(admin.say()); // [Administrator] My name is Bob
// ES6
'use strict';

class User {
  constructor(name) {
    this._name = name;
  }

  say() {
    return 'My name is ' + this._name;
  }
}

class Admin extends User {
  say() {
    return '[Administrator] ' + super.say();
  }
}

var user = new User('Alice');
console.log(user.say()); // My name is Alice

var admin = new Admin('Bob');
console.log(admin.say()); // [Administrator] My name is Bob

Function Arguments

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

// ES5
'use strict';

function loop(func, count) {
  count = count || 3;
  for (var i = 0; i < count; i++) {
    func();
  }
}

function sum() {
  var result = 0;
  for (var i = 0; i < arguments.length; i++) {
    result += arguments[i];
  }
  return result;
}

loop(function () {
  console.log('hello');
}); // hello hello hello
console.log(sum(1, 2, 3, 4)); // 10
// ES6
'use strict';

function loop(func, count = 3) {
  for (var i = 0; i < count; i++) {
    func();
  }
}

function sum(...numbers) {
  return numbers.reduce(function (a, b) {
    return a + b;
  });
}

loop(function () {
  console.log('hello');
}); // hello hello hello
console.log(sum(1, 2, 3, 4)); // 10

์‹ค์ œ๋กœ ์ด ๋””ํดํŠธ ์ธ์ˆ˜๋‚˜ ๊ฐ€๋ณ€ ๊ธธ์ด ์ธ์ˆ˜๋Š” ํ•จ์ˆ˜์˜ ๋ฐ˜์ธ์ˆ˜๋ถ€๋ถ„๋งŒ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š๊ณ , ๋ณ€์ˆ˜์˜ ๋Œ€์ž…์ฒ˜๋ฆฌ์ „๋ฐ˜์ด ๊ฐ•ํ™”๋œ ๊ฒƒ์˜ ์ผ๋ถ€๋ถ„์ด ๋ฉ๋‹ˆ๋‹ค. ES6์—์„œ ๋ณ€์ˆ˜์˜ ๋Œ€์ž…์ฒ˜๋ฆฌ์— ๊ด€ํ•ด์„œ๋Š” Destructuring and parameter handling in ECMAScript 6์—์„œ ์ƒ˜ํ”Œ์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํŒจํ„ด์ด ์†Œ๊ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Arrow Function

JavaScript์—์„œ๋Š” ์ด๋ฒคํŠธ ๊ตฌ๋™์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ž์ฃผ ์ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด DOM์ด ํด๋ฆญ๋˜๋ฉด ๋ญ”๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜, XHR ๋ฆฌํ€˜์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ๋ญ”๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ฒ˜๋ฆฌ๋ฅผ JavaScript์—์„œ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด, ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋‚˜ ์ด๋ฒคํŠธ๋ฆฌ์Šค๋„ˆ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์„ ๋Œ€์ƒ ๊ฐ์ฒด(DOM์ด๋‚˜ XHR)์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๋Š” ์‹œ์ ์—์„œ this์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜์•ˆ์˜ ์–ต์„ธ์Šคํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๋„ ์ž์ฃผ ์žˆ์Šต๋‹ˆ๋‹ค๋งŒ, ์—ฌํƒœ๊นŒ์ง€๋Š” ํด๋กœ์ ธ๋ฅผ ์‚ฌ์šฉํ•ด this๋ฅผ ๋ณด์กดํ•˜๋˜๊ฐ€, Function.prototype.bind๋ฅผ ์‚ฌ์šฉํ•ด this๋ฅผ ์†๋ฐ•ํ•˜๊ฑฐ๋‚˜ ํ–ˆ์Šต๋‹ˆ๋‹ค. ES6์—์„œ๋Š” Arrow Function๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ •์˜ ์‹์ด ๋„์ž…๋˜์–ด, ์ด this์— ๊ด€ํ•œ ๋ฒˆ๊ฑฐ๋กœ์›€์„ ํ•ด์†Œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

// ES5
'use strict';

var ClickCounter = {
  _count: 0,

  start: function (selector) {
    var node = document.querySelector(selector);
    node.addEventListener(
      'click',
      function (evt) {
        this._count++;
      }.bind(this),
    );
  },
};

ClickCounter.start('body');
// ES6
'use strict';

var ClickCounter = {
  _count: 0,

  start: function (selector) {
    var node = document.querySelector(selector);
    node.addEventListener('click', (evt) => {
      this._count++;
    });
  },
};

ClickCounter.start('body');

Promise

์—ฌํƒœ๊นŒ์ง€ XHR๋“ฑ์˜ ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋Š” ์‹œ์ž‘์ „์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ด์„œ, ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๊ฐ€ ๋๋‚˜๋ฉด ๊ทธ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด์—ˆ์ง€๋งŒ, ์—ฌ๋Ÿฌ ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์„ค์ •๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ์˜ ํ•จ์ˆ˜์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋„˜๊ธฐ๊ฑฐ๋‚˜(setTimeout์ด๋‚˜ setInterval), ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ–‰ํ•˜๋Š” ๊ฐ์ฒด์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜(XHR๋‚˜ WebWorker), ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ์˜ ๋ฐ˜ํ™˜๊ฐ’์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜(IndexedDB)๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ์šฉํ•˜๋Š” ์ธก์—์„œ๋Š” ๊ฐ๊ฐ์˜ ๋ฐฉ๋ฒ•์„ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ES6์—์„œ๋Š” Promise๋ผ๋Š” ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ์ข…ํ•ฉ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์–ธ์–ด๋ ˆ๋ฒจ์—์„œ ์žฌ๊ณต๋˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€, ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋Š” Promise๋ฅผ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•ด, ๋ถ€๋ฅธ ์ชฝ์—์„œ๋Š” Promise์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋กํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

// ES5
'use strict';

function sleep(callback, msec) {
  setTimeout(callback, msec);
}

sleep(function () {
  console.log('wake!');
}, 1000);
// ES6
'use strict';

function sleep(msec) {
  return new Promise(function (resolve, reject) {
    setTimeout(resolve, msec);
  });
}

sleep(1000).then(function () {
  console.log('wake!');
});

๋˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์—์„œ๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ try-catch๋กœ ๊ฐ์‹ธ๋„ ๋น„๋™๊ธฐ์—์„œ ์˜ˆ์™ธ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด ๋ณด์ถฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Promise์—์„œ๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋„ ์ข…ํ•ฉ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ œ๊ณต๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด Promise์— ๊ด€ํ•ด์„œ๋Š” Web์—์„œ ๋ฌด๋ฃŒ๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” JavaScript Promiseใฎๆœฌ(๋ฒˆ์—ญ)์ด ๋ฌด์ฒ™ ์ฐธ๊ณ ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

Generator

๋งˆ์ง€๋ง‰์œผ๋กœ Generator์— ๊ด€ํ•ด ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€๋Š” JavaScript์—์„œ ์žˆ์ง€๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ํž˜๋“ค๊ฑฐ๋‚˜, ํ†ต์ผ๋˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์„ ๊ฐœ์„ ํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ, ์ด Generator๋ผ๋Š” ๊ฒƒ์€ ์™„์ „ ์ƒˆ๋กœ์šด ๊ฐœ๋…์œผ๋กœ ES6์— ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค.1 Generator๋Š” ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ์•ˆ์˜ ์ž„์˜์˜ ์žฅ์†Œ์—์„œ ์ฒ˜๋ฆฌ๋ฅผ ์ค‘๋‹จ/์žฌ๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ตฌ์กฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋ฃจํ‹ด(co-rutine)์ด๋ผ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค. ์ฝ”๋ฃจํ‹ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌดํ•œ ๋ฆฌ์Šค๋„ˆ๋‚˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋“ฑ์˜ ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด Generator์™€ Promise๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ๋™๊ธฐ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ์ง๋ ฌ๋กœ ์ ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์ƒ๊ฐ ๋ฒ•์€ โ€œ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐœ์‹œ๋˜๋ฉด ์ฒ˜๋ฆฌ๋ฅผ ์ค‘๋‹จํ•ด, ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ฒ˜๋ฆฌ๋ฅผ ์žฌ๊ฐœํ•œ ๋’ค ์—ฐ๊ฒฐ ์ฒ˜๋ฆฌ๋ฅผ ์‹ฑํ–‰ํ•ด ๋‚˜๊ฐโ€์ž…๋‹ˆ๋‹ค. ์•„๊นŒ, Promise ์ ˆ์—์„œ ์†Œ๊ฐœํ•œ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋ฅผ Generator๋ฅผ ์‚ฌ์šฉํ•ด ์ง๋ ฌ๋กœ ์ ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐ‘์˜ ์ƒ˜ํ”Œ์ฝ”๋“œ์—์„œ๋Š” Generator์™€ Promise๋ฅผ ์‚ฌ์šฉํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง๋ ฌ๋กœ ์ ์„์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” co๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

// ES6
'use strict';

co(function* () {
  console.log('sleep...');
  yield sleep(1000);
  console.log('wake!');
});

์ด๋ฒˆ์—๋Š” co๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด์„คํ–ˆ์ง€๋งŒ, co๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ์ฒ˜๋ฆฌ๋ฅผ ์ง๋ ฌ๋กœ ์ ๋Š” ๊ตฌ์กฐ๋กœ async/await๋ผ๋Š”๊ฒƒ์ด ES7์—์„œ๋Š” ์ œ๊ณต๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.2 Generator์— ๊ด€ํ•ด์„œ๋Š” ์ €์˜ ๋ธ”๋กœ๊ทธ์—์„œ ES6 Generatorใ‚’ไฝฟใฃใฆasync/awaitใ‚’ๅฎŸ่ฃ…ใ™ใ‚‹ใƒกใƒข๋กœ ํ•ด์„ค ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๊ฐ€ ์žˆ์œผ์‹œ๋ฉด ๋ด์ฃผ์„ธ์š”.

๊ฒฐ๋ก 

์ด๋ฒˆ์—๋Š” JavaScript์—์„œ ์•ˆํƒ€๊นŒ์› ๋˜ ๊ณณ์ด ES6์—์„œ ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”๊ฐ€๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์†Œ๊ฐœํ•˜๋Š” ๋‚ด์šฉ์€ ES6์˜ ์ผ๋ถ€๋กœ, ์ด์™ธ์—๋„ Modules, Symbol, Data Structures, Proxy, Template String๋“ฑ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์‹œ์ ์—์„œ๋Š” ES6๋กœ ์ ์€ ์ฝ”๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ธŒ๋ผ์šฐ์ ธ๋‚˜ node์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค๋งŒ, ES6๋ฅผ ES5๋กœ ํŠธ๋žœ์Šค์ปดํŒŒ์ผํ•˜๋Š” ํˆด๋กœ traceur-compiler๋‚˜ 6to5๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ€๋ณ๊ฒŒ ์‹œํ—˜ํ•ด ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๊ฐ ๋ธŒ๋ผ์šฐ์ ธ๋‚˜ ํˆด์ด ES6์˜ ์–ด๋Š ๊ธฐ๋Šฅ์— ๋Œ€์‘ํ•˜๊ณ  ์žˆ๋Š”์ง€๋Š” ECMAScript compatibility table์ด ์ฐธ๊ณ ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ES6์‹œ๋Œ€์˜ JavaScript๋ฅผ ์ค€๋น„ํ•ด์„œ ์ง€๊ธˆ๋ถ€ํ„ฐ ์กฐ๊ธˆ์”ฉ ๊ฑด๋“œ๋ ค ๋ณด์‹œ๋ฉด ์–ด๋–จ๊นŒ์š”?

  1. Firefox์—์„œ๋Š”2006๋…„ ์ฏค์— ์ด๋ฏธ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. C#์˜ async/await์™€ ๊ฐ™์€ ๊ฒƒ

๋‹ค๋ฅธ ๊ธ€ ์ฝ์–ด๋ณด๊ธฐ โฌ‡๏ธ