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

ES(ECMA Script)

ECMAScript(ES5λ‚˜ ES2015의 ESλŠ” ECMAScript의 μ€„μž„λ§μ΄λ‹€.)λŠ” Ecma μΈν„°λ‚΄μ…”λ„μ—μ„œ μ •μ˜ν•œ ECMA-262 기술 κ·œκ²©μ— μ •μ˜λœ ν‘œμ€€ 슀크립트 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μž…λ‹ˆλ‹€. κ°„λ‹¨νžˆ λ§ν•˜μžλ©΄ ν‘œμ€€ν™”λœ 슀크립트 μ–Έμ–΄μž…λ‹ˆλ‹€.
λŒ€μ€‘μ μœΌλ‘œ 유λͺ…ν•œ ES6의 경우 ES5 μ΄ν•˜ λͺ…μ„Έμ—μ„œ λ¬Έμ œκ°€ λ˜μ—ˆλ˜ 뢀뢄듀이 ν•΄κ²°λ˜μ—ˆκ³ , κΈ°μ‘΄ μ½”λ“œλ₯Ό 더 κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆλŠ” μƒˆλ‘œμš΄ 문법이 μΆ”κ°€λ˜λ©΄μ„œ 더 가독성 및 μœ μ§€ λ³΄μˆ˜μ„±μ΄ ν–₯μƒλ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ·Έ 덕에 μ›Ήμ—μ„œ μ‚¬μš©ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 유λͺ… λΌμ΄λΈŒλŸ¬λ¦¬λ“€(lodash, React, Vue λ“±)의 개발 ν™˜κ²½λ„ ES6둜 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ΅œμ‹  μžλ°”μŠ€ν¬λ¦½νŠΈ λΌμ΄λΈŒλŸ¬λ¦¬λ“€λ„ ES6λ₯Ό μ‚¬μš©ν•  λ•Œ 훨씬 νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ES6μ—μ„œ μƒˆλ‘œ μΆ”κ°€λœ 문법, κΈ°λŠ₯λ“€

트랜슀파일러λ₯Ό μ‚¬μš©ν•œ 크둜슀 λΈŒλΌμš°μ§• 지원

μ§€κΈˆμ€ IE(Internet Explorer)κ°€ κ³΅μ‹μ μœΌλ‘œ 지원 μ’…λ£Œλ˜λ©°, IT μ—…κ³„μ—μ„œλŠ” 사μž₯λ˜μ—ˆμ§€λ§Œ μ „ 세계 일뢀 μ‚¬λžŒλ“€μ€ 아직 IEλ₯Ό μ‚¬μš©μ€‘μΌ κ²ƒμž…λ‹ˆλ‹€.
이에 Babel μ΄λΌλŠ” νŠΈλžœμŠ€νŒŒμΌλŸ¬κ°€ λ“±μž₯ν•˜λ©΄μ„œ, 각 λΈŒλΌμš°μ € κ°„μ˜ 간극을 ν•΄μ†Œμ‹œμΌœμ£Όμ—ˆμŠ΅λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄ ES6 λ¬Έλ²•μ˜ 경우 IEμ—μ„œλŠ” μ‚¬μš©ν•  μˆ˜κ°€ μ—†λŠ”λ°, μ΄λ•Œ Babel을 μ‚¬μš©ν•΄ ES6 λ¬Έλ²•μœΌλ‘œ μž‘μ„±λœ JavaScript μ½”λ“œλ₯Ό IEκ°€ 읽을 수 μžˆλŠ” JavaScript μ½”λ“œλ‘œ λ³€ν™˜ν•΄μ£ΌλŠ” κ²ƒμž…λ‹ˆλ‹€.

let, const의 λ“±μž₯

ES6 이전 λ¬Έλ²•μ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κΈ° μœ„ν•΄μ„œλŠ” var ν‚€μ›Œλ“œλ₯Ό μ„ νƒν•˜λŠ” 선택지밖에 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.
타 μ–Έμ–΄λ“€κ³ΌλŠ” 달리 JavaScriptμ—μ„œ var둜 μ„ μ–Έν•œ λ³€μˆ˜λŠ” ν•¨μˆ˜ λ‹¨μœ„μ˜ μŠ€μ½”ν”„λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— ifλ¬Έμ΄λ‚˜ forλ¬Έ 블둝 λ‚΄μ—μ„œ varλ₯Ό μ„ μ–Έν•œ λ³€μˆ˜λ“€λ„ 블둝 μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. κ²Œλ‹€κ°€ varλ₯Ό μ΄μš©ν•˜λ©΄ μ„ μ–Έ 전에 λ³€μˆ˜μ˜ μ‚¬μš©μ΄ κ°€λŠ₯ν•œ ν˜Έμ΄μŠ€νŒ…(hoisting)도 λ°œμƒν•©λ‹ˆλ‹€.
이에 JavaScript κ°œλ°œμžλ“€μ€ λ³€μˆ˜λͺ… 좩돌, μ˜λ„μΉ˜ μ•Šμ€ κ°’ 변경을 ν”Όν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ λ…Έλ ₯듀을 ν•΄μ™”μŠ΅λ‹ˆλ‹€.

 

블둝 μŠ€μ½”ν”„ 지원

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κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

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 λ³€μˆ˜ μ΄ˆκΈ°ν™” 이전에 λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— μ°Έμ‘° μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€.

 

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λ₯Ό μ‚¬μš©ν–ˆμœΌλ―€λ‘œ ν”„λ‘œνΌν‹°λ‚˜ λ°°μ—΄ μš”μ†ŒκΉŒμ§€ λ³€κ²½ λΆˆκ°€λŠ₯ν•˜λ‹€κ³  생각할 수 있기 λ•Œλ¬Έμ— μ°Έμ‘° 값을 μ‚¬μš©ν•  λ•ŒλŠ” μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

ν™”μ‚΄ν‘œ ν•¨μˆ˜(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 객체λ₯Ό λ°”μΈλ“œ ν•œ ν•¨μˆ˜ ν‘œν˜„μ‹μ²˜λŸΌ λ™μž‘ν•©λ‹ˆλ‹€.

클래슀(Class)

μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” ν”„λ‘œν† νƒ€μž… 기반 μ–Έμ–΄μž…λ‹ˆλ‹€. 클래슀 기반의 μ–Έμ–΄μ™€λŠ” 달리 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” ν”„λ‘œν† νƒ€μž… 객체λ₯Ό μž¬μ‚¬μš©ν•˜λ©΄μ„œ ν΄λž˜μŠ€μ™€ μœ μ‚¬ν•œ ν˜•νƒœμ˜ APIλ₯Ό λ§Œλ“€μ–΄μ„œ μ‚¬μš©ν•΄μ™”μŠ΅λ‹ˆλ‹€. ES5 ν™˜κ²½μ—μ„œ 클래슀λ₯Ό κ΅¬ν˜„ν•˜λŠ” 방법은 λΌμ΄λΈŒλŸ¬λ¦¬λ§ˆλ‹€ λ‹¬λžμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ ES6λΆ€ν„° μžλ°”μŠ€ν¬λ¦½νŠΈμ— 클래슀 문법이 μΆ”κ°€λ˜μ—ˆκ³ , λΌμ΄λΈŒλŸ¬λ¦¬λ“€λ„ 클래슀 문법을 μ‚¬μš©ν•˜λ©΄μ„œ κ΅¬ν˜„κ³Ό μ‚¬μš©λ²•λ„ ν•œκ°€μ§€λ‘œ ν†΅μΌλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

문법

class SomeClass {
  static staticClassMethod() {
    // 정적 λ©”μ„œλ“œ
  }

  constructor() {
    // μƒμ„±μž ν•¨μˆ˜
  }

  someMethod() {
    // 클래슀 λ§€μ„œλ“œ
  }
}

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

SomeClass.staticClassMethod();

클래슀 문법은 class ν‚€μ›Œλ“œ, 클래슀 이름, μƒμ„±μž ν•¨μˆ˜μΈ constructor(), λ©”μ„œλ“œλ“€, 클래슀 상속을 μœ„ν•œ extends ν‚€μ›Œλ“œ, 그리고 정적 멀버인 static ν‚€μ›Œλ“œλ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 클래슀λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” class ν‚€μ›Œλ“œ 뒀에 클래슀의 이름을 적어주고, λ‹€λ₯Έ 클래슀의 멀버λ₯Ό μƒμ†ν•˜κΈ° μœ„ν•΄μ„œλŠ” extends ν‚€μ›Œλ“œ 뒀에 상속받을 클래슀λ₯Ό μž‘μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€. ν΄λž˜μŠ€λ„ ν•¨μˆ˜ μ‚¬μš©κ³Ό 같이 선언식과 ν‘œν˜„μ‹ 두 κ°€μ§€λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

클래슀 선언식

class SomeClass {
  //class body
}

ν”„λ‘œν† νƒ€μž… 기반 클래슀

클래슀 문법이 μ—†λŠ” 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 예제 μ½”λ“œλ₯Ό 보면 μ–΄λŠ μ½”λ“œκ°€ 클래슀이고 μƒμ„±μž ν•¨μˆ˜μΈμ§€ μ‰½κ²Œ 확인할 수 있고, λ©”μ„œλ“œλ„ 클래슀 내뢀에 μΊ‘μŠν™”λ˜μ–΄ 가독성이 쒋아진 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄(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 λ²„μ „μ˜ μ˜ˆμ œλ³΄λ‹€ 훨씬 더 μžμ—°μŠ€λŸ½κ²Œ ν‘œν˜„μ΄ 된 것을 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

λ””μŠ€νŠΈλŸ­μ²˜λ§(Destructuring)

JavaScript κ°œλ°œμ„ ν•˜λ‹€ 보면 객체λ₯Ό ν•¨μˆ˜λΌλ¦¬ μ£Όκ³ λ°›λŠ” 상황이 μ•„μ£Ό λ§ŽμŠ΅λ‹ˆλ‹€. 전달받은 객체의 ν”„λ‘œνΌν‹°λ₯Ό λ³€μˆ˜λ‘œ μ„ μ–Έν•˜λ €λ©΄ 각 ν”„λ‘œνΌν‹°λ₯Ό λ³„λ„μ˜ λ³€μˆ˜λ‘œ ν• λ‹Ήν•˜κΈ° μœ„ν•΄μ„œ 각 ν”„λ‘œνΌν‹°λ§ˆλ‹€ λ…λ¦½λœ 할당문을 μž‘μ„±ν•΄μ•Ό ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ””μŠ€νŠΈλŸ­μ²˜λ§μ΄λΌκ³  λΆˆλ¦¬λŠ” 문법이 μΆ”κ°€λ˜μ–΄ λ³€μˆ˜ 선언이 훨씬 더 νŽΈν•΄μ‘Œκ³ , μ½”λ“œκ°€ κ°„κ²°ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€.

λ³€μˆ˜ μ„ μ–Έ

λ¨Όμ € λ³€μˆ˜μ˜ ν”„λ‘œνΌν‹°λ₯Ό μ‰½κ²Œ μ„ μ–Έν•˜λŠ” μ˜ˆμ œμž…λ‹ˆλ‹€. 객체 λ””μŠ€νŠΈλŸ­μ²˜λ§μ€ λ³€μˆ˜λ‘œ μ„ μ–Έν•˜κ³ μž ν•˜λŠ” 객체의 ν”„λ‘œνΌν‹°λͺ…을 {, }μ•ˆμ— λ‚˜μ—΄ν•˜λ©΄ 각 ν”„λ‘œνΌν‹°μ˜ μ΄λ¦„μœΌλ‘œ λ³€μˆ˜κ°€ μƒμ„±λ˜κ³  ν”„λ‘œνΌν‹°μ˜ 값이 μžλ™μœΌλ‘œ ν• λ‹Ήλ©λ‹ˆλ‹€. λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§λ„ λΉ„μŠ·ν•œλ° [, ] μ•ˆμ— λ‚˜μ—΄ν•˜λŠ” λ³€μˆ˜μ˜ 이름에 λ§žλŠ” 인덱슀의 λ°°μ—΄ μš”μ†Œκ°€ λ³€μˆ˜μ˜ κ°’μœΌλ‘œ ν• λ‹Ήλ©λ‹ˆλ‹€.

 

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.*κ°€ 사라지고 ν•œ μ€„μ§œλ¦¬ κ°„κ²°ν•œ μ½”λ“œλ‘œ λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.

νŒŒλΌλ―Έν„° λ‚΄λΆ€ λ³€μˆ˜ μ„ μ–Έ

νŒŒλΌλ―Έν„°λ‘œ 받은 객체의 ν”„λ‘œνΌν‹°λ₯Ό λ³€μˆ˜λ‘œ μ„ μ–Έν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ•ŒλŠ” λ³„λ„μ˜ λ³€μˆ˜ μ„ μ–Έλ¬Έ 없이 νŒŒλΌλ―Έν„°μ˜ μœ„μΉ˜μ— λ””μŠ€νŠΈλŸ­μ²˜λ§ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€. μ„ μ–Έν•  λ³€μˆ˜μ˜ 이름은 κΈ°μ‘΄ 객체에 μ„ μ–Έλœ 이름 말고 λ‹€λ₯Έ μ΄λ¦„μœΌλ‘œλ„ μ„ μ–Έ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

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λ₯Ό :둜 μ—°κ²°ν•΄μ„œ λ³€μˆ˜λͺ…을 μ‰½κ²Œ λ°”κΏ€ 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜μ˜ λ””ν΄νŠΈ κ°’ μ„€μ •

λ””ν΄νŠΈκ°’ ν• λ‹Ή

ν•¨μˆ˜ λ§€κ°œλ³€μˆ˜μ˜ λ””ν΄νŠΈ κ°’ 섀정을 μžλ°”μŠ€ν¬λ¦½νŠΈ λ¬Έλ²•μ—μ„œ μ§€μ›ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ””ν΄νŠΈ κ°’ μ„€μ •μ΄λž€ ν•¨μˆ˜μ˜ μ˜€λ™μž‘μ„ 막기 μœ„ν•΄ νŠΉμ • νƒ€μž… ν˜Ήμ€ 값을 κ°€μ Έμ•Ό ν•  λ§€κ°œλ³€μˆ˜κ°€ 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!"

Rest νŒŒλΌλ―Έν„°, Spread ν‘œν˜„μ‹

ES6λŠ” 객체 λ¦¬ν„°λŸ΄μ΄λ‚˜ λ°°μ—΄ λ¦¬ν„°λŸ΄μ˜ μ‚¬μš©μ„±μ΄ λŒ€ν­ μ’‹μ•„μ‘ŒμŠ΅λ‹ˆλ‹€. Rest νŒŒλΌλ―Έν„°λ‚˜ Spread ν‘œν˜„ 식도 κ·Έ 쀑에 ν•˜λ‚˜μž…λ‹ˆλ‹€.

Spread ν‘œν˜„μ‹

λ°°μ—΄μ΄λ‚˜ 객체 λ¦¬ν„°λŸ΄ 내뢀에 ...ids 와 같이 μž‘μ„±ν•˜λ©΄ ν•΄λ‹Ή μœ„μΉ˜μ— ids의 각 λ°°μ—΄ μš”μ†Œλ‚˜ ν”„λ‘œνΌν‹°λ₯Ό ν’€μ–΄λƒ…λ‹ˆλ‹€. Spread ν‘œν˜„μ‹μ€ ν•¨μˆ˜ ν˜ΈμΆœμ΄λ‚˜ λ°°μ—΄ 및 객체 λ¦¬ν„°λŸ΄ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ°°μ—΄ λ³΅μ‚¬λ‚˜ λΆˆλ³€(immutable)객체 생성도 μ†μ‰½κ²Œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ... μ—°μ‚°μžμ™€ ν•¨κ»˜ ν’€μ–΄λ‚Ό 객체λ₯Ό, 그리고 κ·Έ 뒀에 μΆ”κ°€/변경될 λ‚΄μš©μ„ μž‘μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€.

배열을 ν•¨μˆ˜ νŒŒλΌλ―Έν„°λ“€λ‘œ λ³€κ²½ν•˜κΈ°

배열을 ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ“€λ‘œ λ³€κ²½ν•  λ•Œ Spread ν‘œν˜„μ‹μœΌλ‘œ νŽΈλ¦¬ν•˜κ²Œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ES5

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

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

ES6

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

textToFriends(...friends);

λ°°μ—΄ 및 객체 ν™•μž₯

μƒˆλ‘œμš΄ 배열에 λ‹€λ₯Έ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό ν•œ λ²ˆμ— μΆ”κ°€ν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ 객체에 λ‹€λ₯Έ 객체의 ν”„λ‘œνΌν‹°λ“€μ„ μΆ”κ°€ν•  λ•Œλ„ μ½”λ“œκ°€ 훨씬 κΉ”λ”ν•˜κ²Œ μœ μ§€λ©λ‹ˆλ‹€. μƒˆλ‘œμš΄ 객체λ₯Ό λ§Œλ“œλŠ” 경우, 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'
};

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 객체λ₯Ό λ°°μ—΄μ²˜λŸΌ μ‚¬μš©ν•˜μ§€ μ•Šλ”λΌλ„ λ§€κ°œλ³€μˆ˜λ“€μ„ λ³€μˆ˜μ™€ λ°°μ—΄λ‘œ λΆ„λ¦¬ν•΄μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ œλ„ˆλ ˆμ΄ν„°(Generator)

ES6의 μ œλ„ˆλ ˆμ΄ν„°λŠ” Generator μƒμ„±μžλ‚˜ function* ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•©λ‹ˆλ‹€. μ œλ„ˆλ ˆμ΄ν„°λŠ” μ½”λ“œμ˜ 진행 νλ¦„μ—μ„œ μž μ‹œ λΉ μ Έλ‚˜κ°”λ‹€κ°€ λ‹€μ‹œ λŒμ•„μ˜¬ 수 μžˆλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

문법

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*

ν”„λ‘œλ―ΈμŠ€(Promise)

ν”„λ‘œλ―ΈμŠ€λŠ” 비동기 μ²˜λ¦¬κ°€ μΆ”μƒν™”λœ κ°μ²΄μž…λ‹ˆλ‹€. μ‚¬μš©μžκ°€ μž‘μ„±ν•œ 비동기 μ²˜λ¦¬κ°€ μ™„λ£Œλ˜κ±°λ‚˜ μ‹€νŒ¨λ˜μ—ˆλŠ”μ§€ μ•Œλ €μ£Όκ³  비동기 처리 결괏값을 λ°˜ν™˜ν•΄μ€λ‹ˆλ‹€. 이λ₯Ό 톡해 성곡 μ‹œ μ‹€ν–‰ν•  ν•¨μˆ˜, μ‹€νŒ¨ μ‹œ μ‹€ν–‰ν•  ν•¨μˆ˜λ₯Ό λ“±λ‘ν•΄μ„œ νŽΈλ¦¬ν•˜κ²Œ 비동기 처리 μ½”λ“œ μž‘μ„±μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. ν”„λ‘œλ―ΈμŠ€λ₯Ό μ΄μš©ν•˜λ©΄ 비동기 처리λ₯Ό μœ„ν•œ 콜백 ν•¨μˆ˜λ“€λ‘œ μ—¬λŸ¬ κ²Ή 감싸진 콜백 지μ˜₯ μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

문법

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λ₯Ό μ΄μš©ν•΄μ„œ λ“±λ‘ν–ˆμŠ΅λ‹ˆλ‹€.

콜백 ν”ΌλΌλ―Έλ“œ κ°œμ„ ν•˜κΈ°

κΈ°μ‘΄ 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둜 ν•΄κ²°ν•©λ‹ˆλ‹€. λ˜ν•œ 겹겹이 μŒ“μ—¬κ°€λŠ” 콜백 ν•¨μˆ˜μ™€ λΉ„κ΅ν•˜λ©΄ ν”„λ‘œλ―ΈμŠ€λŠ” 비동기 μ²˜λ¦¬λ“€μ„ μˆœμ„œλŒ€λ‘œ μ—°κ²°ν•΄μ„œ 읽기 μ‰½κ²Œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬λŸ¬ 개의 ν”„λ‘œλ―ΈμŠ€ μ²˜λ¦¬ν•˜κΈ°

ν”„λ‘œλ―ΈμŠ€λŠ” 단일 비동기 μš”μ²­μ„ 닀루기 μœ„ν•œ κ°μ²΄μž…λ‹ˆλ‹€. μ—¬λŸ¬ 개의 비동기 μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν”„λ‘œλ―ΈμŠ€ 객체λ₯Ό μ—¬λŸ¬ 개 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ΄λ•Œ 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ν”„λ‘œλ―ΈμŠ€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

async/await

async ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ 비동기 처리λ₯Ό λ”μš±λ” κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. async ν•¨μˆ˜λŠ” μ—¬λŸ¬ 개의 ν”„λ‘œλ―ΈμŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œλ₯Ό 동기 ν•¨μˆ˜ μ‹€ν–‰κ³Ό λΉ„μŠ·ν•œ λͺ¨μŠ΅μœΌλ‘œ μ‚¬μš©ν•  수 있게 ν•΄μ€λ‹ˆλ‹€. async ν‚€μ›Œλ“œκ°€ μ•žμ— 뢙은 ν•¨μˆ˜μ„ μ–Έλ¬Έμ˜ ν•¨μˆ˜ λ³Έλ¬Έμ—λŠ” await 식이 포함될 수 μžˆλ‹€. 이 await 식은 async ν•¨μˆ˜ 싀행을 μΌμ‹œ μ€‘μ§€ν•˜κ³  ν‘œν˜„μ‹μ— μ „λ‹¬λœ ν”„λ‘œλ―ΈμŠ€μ˜ 해결을 κΈ°λ‹€λ¦° λ‹€μŒ async ν•¨μˆ˜μ˜ 싀행을 μž¬κ°œν•˜κ³ , ν•¨μˆ˜μ˜ 싀행이 λͺ¨λ‘ μ™„λ£Œλœ 뒀에 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€. λ¬Όλ‘  await 식은 async ν•¨μˆ˜ λ‚΄μ—μ„œλ§Œ μœ νš¨ν•©λ‹ˆλ‹€. μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•œλ‹€λ©΄ 문법 μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€. async ν•¨μˆ˜μ˜ λ°˜ν™˜ 값은 ν”„λ‘œλ―ΈμŠ€μ΄λ©°, returnValueλ₯Ό λ°˜ν™˜ν•˜λ©΄ μ•”λ¬΅μ μœΌλ‘œ Promise.resolve(returnValue) ν˜•νƒœλ‘œ κ°μ‹Έμ Έμ„œ λ°˜ν™˜λ©λ‹ˆλ‹€. ν”„λ‘œλ―ΈμŠ€μ— catch둜 μ²˜λ¦¬ν•˜λ˜ μ—λŸ¬λŠ” 일반 ν•¨μˆ˜μ—μ„œμ˜ try/catch문으둜 μž‘μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€. μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ ν”„λ‘œλ―ΈμŠ€μ˜ reject에 μ „λ‹¬λ˜λŠ” 값이 μ—λŸ¬ 객체둜 λ„˜μ–΄μ˜΅λ‹ˆλ‹€.

ν”„λ‘œλ―ΈμŠ€

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);
    }
  });

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);
    }
  });

λͺ¨λ“ˆ(ES Module)

μžλ°”μŠ€ν¬λ¦½νŠΈλ„ λͺ¨λ“ˆ 개발이 κ°€λŠ₯ν•©λ‹ˆλ‹€. ES5μ—μ„œλŠ” Webpack, Rollup, Parcel 같은 λ²ˆλ“€λŸ¬λ‚˜ Babel 같은 트랜슀파일러λ₯Ό μ‚¬μš©ν•΄μ„œ λΈŒλΌμš°μ €μ—μ„œ μ‹€ν–‰ν•  수 μžˆλ„λ‘ λ°”κΏ”μ£Όμ–΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€. ES6μ—μ„œλŠ” λͺ¨λ“ˆμ„ μ΄μš©ν•΄μ„œ κ°œλ°œν•  수 μžˆλŠ” κ°„κ²°ν•œ 문법을 μ§€μ›ν•©λ‹ˆλ‹€. λͺ¨λ“ˆ λͺ…μ„Έλ₯Ό κ΅¬ν˜„ν•œ λͺ¨λ˜ λΈŒλΌμš°μ €λ“€λΆ€ν„°λŠ” import, export문을 μ‚¬μš©ν•΄μ„œ λͺ¨λ“ˆμ„ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“ˆμ€ .js ν™•μž₯자둜 λ§Œλ“€μ–΄μ§„ νŒŒμΌμ„ λœ»ν•œν•©λ‹ˆλ‹€. 파일 λ‚΄λΆ€μ—μ„œ λ³„λ„μ˜ module λ“±μ˜ ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•  ν•„μš”κ°€ μ—†μœΌλ©°, μžλ°”μŠ€ν¬λ¦½νŠΈ λͺ¨λ“ˆμ˜ μ½”λ“œλŠ” 기본적으둜 strict λͺ¨λ“œλ‘œ λ™μž‘ν•©λ‹ˆλ‹€. λͺ¨λ“ˆ μ•ˆμ—μ„œλŠ” import, export ν‚€μ›Œλ“œλ₯Ό 톡해 λ‹€λ₯Έ λͺ¨λ“ˆκ³Ό 객체λ₯Ό 주고받을 수 μžˆμŠ΅λ‹ˆλ‹€. ν•œ 개의 λͺ¨λ“ˆ μ•ˆμ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λ‚˜ ν•¨μˆ˜ 등은 κ·Έ λͺ¨λ“ˆ λ‚΄λΆ€ μŠ€μ½”ν”„λ₯Ό κ°€μ§‘λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ λ‚΄κ°€ μž‘μ„±ν•œ λͺ¨λ“ˆμ˜ λ³€μˆ˜λ₯Ό λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ? λ°”λ‘œ exportλ₯Ό 톡해 λͺ¨λ“ˆ μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μžˆλ„λ‘ λ§Œλ“€μ–΄μ£Όλ©΄ λ©λ‹ˆλ‹€. export문을 톡해 ν•¨μˆ˜, 클래슀, λ³€μˆ˜ 듀을 λͺ¨λ“ˆ μ™ΈλΆ€λ‘œ 내보낼 수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ 이제 export문을 μ‚¬μš©ν•˜λŠ” 법을 μ‚΄νŽ΄λ³Ό κ²ƒμž…λ‹ˆλ‹€. λͺ¨λ“ˆ μ™ΈλΆ€λ‘œ λ‚΄λ³΄λ‚΄λŠ” 방법은 Named export, Default export 두 가지가 μžˆμŠ΅λ‹ˆλ‹€.

Named export

students.js

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

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

Named exportλŠ” ν•œ νŒŒμΌμ—μ„œ μ—¬λŸ¬ 번 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Named exportλ₯Ό 톡해 내보낸 것 듀은 μΆ”ν›„ λ‹€λ₯Έ λͺ¨λ“ˆμ—μ„œ 내보낼 λ•Œμ™€ 같은 μ΄λ¦„μœΌλ‘œ import ν•΄μ•Όν•©λ‹ˆλ‹€.

Default export

studentJack.js

export default 'Jack'

λ°˜λ©΄μ— Default exportλŠ” ν•œ 슀크립트 νŒŒμΌλ‹Ή ν•œ 개만 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 export default의 λ’€μ—λŠ” ν‘œν˜„μ‹λ§Œ ν—ˆμš©λ˜λ―€λ‘œ var, let, constλ“±μ˜ ν‚€μ›Œλ“œλŠ” μ‚¬μš©ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ 내보낸 객체듀은 λͺ¨λ“ˆλ“€μ—μ„œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡λ‹€λ©΄ μ§€κΈˆλΆ€ν„°λŠ” λͺ¨λ“ˆμ—μ„œ export ν•œ 객체듀을 κ°€μ Έμ˜€λŠ” import문을 μ‚΄νŽ΄λ΄…μ‹œλ‹€.

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 [[λ³€μˆ˜λͺ…]] ν˜•νƒœλ‘œ ν•΄λ‹Ή 객체듀을 가지고 μžˆμ„ λ³€μˆ˜λͺ…을 μ •ν•©λ‹ˆλ‹€.

Default export 된 객체 μ‚¬μš©ν•˜κΈ°

import jack from 'studentJack';

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

μ‚¬μš©λ²•μ€ Named export와 λΉ„μŠ·ν•˜μ§€λ§Œ {, }둜 감싸지 μ•Šκ³  λ³€μˆ˜λͺ…을 importλ¬Έ 뒀에 μž‘μ„±ν•©λ‹ˆλ‹€. λ³€μˆ˜ 이름을 λ°”κΏ”μ„œ κ°€μ Έμ˜¬ 수 μžˆλŠ”λ°, Default export 된 κ°μ²΄λŠ” νŒŒμΌλ§ˆλ‹€ μœ μΌν•˜λ―€λ‘œ as ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šλ”λΌλ„ 이름을 λ°”κΏ”μ„œ 뢈러올 수 μžˆμŠ΅λ‹ˆλ‹€. import ν‚€μ›Œλ“œ 뒀에 μ‚¬μš©ν•œ 이름이 객체의 λ³€μˆ˜λͺ…이 λ©λ‹ˆλ‹€.

두 방법 λ‹€ μ‚¬μš©ν•˜κΈ°

μ•žμ„œ μ†Œκ°œν•œ 객체λ₯Ό κ°€μ Έμ˜€λŠ” 방법 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"

Reference

 

ES5 to ES6+

ECMAScript(ES5λ‚˜ ES2015의 ESλŠ” ECMAScript의 μ€„μž„λ§μ΄λ‹€.)λŠ” Ecma μΈν„°λ‚΄μ…”λ„μ—μ„œ μ •μ˜ν•œ ECMA-262 기술 κ·œκ²©μ— μ •μ˜λœ ν‘œμ€€ 슀크립트 ν”„λ‘œκ·Έλž˜λ° 언어이닀. ECMAScriptλŠ” 1997년에 1판이 배포되고 κ·Έ λ’€λ‘œ 맀년

ui.toast.com

 

λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€!