
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
'๐ฅ Front-End > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] TDZ (0) | 2022.07.21 |
---|---|
[JS] ์คํ ์ปจํ ์คํธ, ํธ์ด์คํ , ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์ (0) | 2022.07.21 |
[JS] ํด๋ก์ (Closure) (0) | 2022.07.21 |
[JS] ์ค์ฝํ(Scope) (0) | 2022.07.21 |
[JS] JavaScript ๊ฐ์ฒด์ ๋ถ๋ณ์ฑ (0) | 2022.07.20 |