JavaScript์์ ES ๋?
ECMASCRIPT์ ์ฝ์ด๋ฅผ ๋ปํ๋ฉฐ, ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ค, ๊ท๊ฒฉ์ ๋ํ๋ด๋ ์ฉ์ด์ด๋ค.
๋ชจ๋ ๋ธ๋ผ์ฐ์ ์์ ๋์ํ ์ ์๋ ํ์คํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํ์ํด์ง๋ฉด์
๋น์๋ฆฌ ํ์คํ ๊ธฐ๊ตฌ์ธ ECMA ์ธํฐ๋ค์ ๋์ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์คํ๋ฅผ ์์ฒญํ์๋ค.
ES5 ๋ 2009๋ ๋์ HTML5์ ํจ๊ป ์ถ์ฐํ ํ์ค ์ฌ์์ด๋ฉฐ,
ES6๋ 2015๋ ์ ๋ฒ์ ์ ์ํ์ฌ ์ถ์ํ ๋ฒ์ ์ด๋ค.
ES6 ์ดํ๋ก๋ ๋งค๋ ์ ๋ฐ์ดํธ๊ฐ ๋๊ณ ์๊ณ , ์ดํ๋ฅผ '๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ'๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋์๋ ES6์ ํฌํจ๋
let, const ํค์๋ / ํ์ดํ ํจ์ / ํด๋์ค / ๋ชจ๋ ๋ค๋ฃจ๊ณ ์๋ค.
let, const ํค์๋
ES5
ES5์ ๋ณ์ ์ ์ธ ๋ฐฉ๋ฒ์ var๊ฐ ์ ์ผํ๋ค.
var : ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ๋์์ ์คํ
๋จ์ :
ํจ์ ๋ ๋ฒจ ์ค์ฝํ ์ง์ → ์ง์ญ๋ณ์๋ฅผ ์ ์ญ๋ณ์๋ก ์ฌ์ฉ๋จ๋ฐ
varํค์๋ ์๋ต ํ์ฉ → ์๋ฌต์ ์ ์ญ๋ณ์ ์์ฐ
๋ณ์ ์ค๋ณต ์ ์ธ ํ์ฉ → ๋ณ์๊ฐ์ ์๋์น ์์ ๋ณ๊ฒฝ
๋ณ์ ํธ์ด์คํ → ์ ์ธํ๊ธฐ ์ด์ ์ ์ฐธ์กฐ
ES6
var ํค์๋์ ๋จ์ ์ ๋ณด์ํ๊ธฐ์ํด
let๊ณผ const ํค์๋๊ฐ ๋์ ๋์๋ค.
const : ์์(๋ณํ์ง ์๋ ๊ฐ, ์ฌํ ๋น x)
let : ์ฌํ ๋น์ด ๊ฐ๋ฅํ ๊ฐ
๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ → ์ง์ญ๋ณ์{ } ์์ ์ฌ์ฉ๋ ๋ณ์๋ ์ฝ๋ ๋ธ๋ก๋ด์์๋ง ์ ํจ
๋ณ์ ์ค๋ณต ์ ์ธ ๊ธ์ง → ์ค๋ณต ์ ์ธ์, ๋ฌธ๋ฒ์๋ฌ๊ฐ ๋ฐ์
ํธ์ด์คํ → ๋ณ์ ์ ์ธ ์ด์ ์๋ ์ฐธ์กฐํ ์ ์๋ค.
๋ณ์ ์ ์ธ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก const๋ฅผ ์ฌ์ฉํ๊ณ ,
let์ ์ฌํ ๋น์ด ํ์ํ ๊ฒฝ์จ ํ์ ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
์ ์ญ ๋ณ์ (Global scope)
์ ์ญ์์ ์ ์ธ๋ ๋ณ์์ด๋ฉฐ, ์ด๋์์๋ ์ง ์ฐธ์กฐํ ์ ์๋ค.
์ง์ญ ๋ณ์ (Local scope of Function-level scope)
์ง์ญ(ํจ์) ๋ด์์ ์ ์ธ๋ ๋ณ์์ด๋ฉฐ, ๊ทธ ์ง์ญ๊ณผ ๊ทธ์ง์ญ์ ํ๋ถ์ง์ญ์์๋ง ์ฐธ์กฐํ ์ ์๋ค.
ํจ์ ๋ ๋ฒจ ์ค์ฝํ (Function-level scope)
ํจ์ ๋ด์์ ์ ์ธ๋ ๋ณ์๋ ํจ์ ๋ด์์๋ง ์ ํจ, ํจ์ ์ธ๋ถ์์๋ ์ฐธ์กฐํ ์ ์๋ค.
์ฆ, ํจ์ ๋ด๋ถ์์ ์ ์ธ๋ณ์๋ ์ง์ญ๋ณ์ / ํจ์ ์ธ๋ถ์์ ์ ์ธํ ๋ณ์๋ ์ ์ญ ๋ณ์
๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ (Block-level scope)
๋ชจ๋ ์ฝ๋ ๋ธ๋ก(ํจ์ if๋ฌธ, for๋ฌธ, while๋ฌธ, try/catch ๋ฌธ ๋ฑ)๋ด์์ ์ ์ธ๋ ๋ณ์๋ ์ฝ๋ ๋ถ๋ก ๋ด์์๋ง ์ ํจ,
์ฝ๋ ๋ธ๋ก ์ธ๋ถ์์๋
ํ์ดํ ํจ์(Arrow function)์ ์ ์ธ
ํ์ดํ ํจ์๋ functionํค์๋ ๋์ (=>)๋ฅผ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ์ ์ธํ๋ค.
// ๋งค๊ฐ๋ณ์ ์ง์ ๋ฐฉ๋ฒ
() => { ... } // ๋งค๊ฐ๋ณ์๊ฐ ์์ ๊ฒฝ์ฐ
x => { ... } // ๋งค๊ฐ๋ณ์๊ฐ ํ ๊ฐ์ธ ๊ฒฝ์ฐ, ์๊ดํธ๋ฅผ ์๋ตํ ์ ์๋ค.
(x, y) => { ... } // ๋งค๊ฐ๋ณ์๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ, ์๊ดํธ๋ฅผ ์๋ตํ ์ ์๋ค.
ES5๋ณด๋ค ES6์ ํ์ดํ ํจ์๋ ์ข๋ ๊ฐ๊ฒฐํ๊ฒ ํํ๋๋ค.
// ES5
var pow = function (x) { return x * x; };
console.log(pow(10)); // 100
// ES6
const pow = x => x * x;
console.log(pow(10)); // 100
๊ธฐ์กด์ ํจ์์ this ๋ฐ์ธ๋ฉ์ด ๋ค๋ฅด๋ฉฐ,
Lexical this๋ฅผ ์ง์ํ๋ฏ๋ก ์ฝ๋ฐฑํจ์๋ก ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํ๋ค.
(์ด ๋ถ๋ถ์ ์ถ๊ฐ์ ์ผ๋ก ๊ณต๋ถ๊ฐ ํ์ํ ๊ฒ๊ฐ๋ค.)
ํด๋์ค(Class)
ES5
์์ฑ์ ํจ์์ ํ๋กํ ํ์ , ํด๋ก์ ๋ฅผ ์ฌ์ฉํ์ฌ
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ตฌํํ์๋ค.
// ES5
var Person = (function () {
// Constructor
function Person(name) {
this._name = name;
}
// public method
Person.prototype.sayHi = function () {
console.log('Hi! ' + this._name);
};
// return constructor
return Person;
}());
var me = new Person('Lee');
me.sayHi(); // Hi! Lee.
console.log(me instanceof Person); // true
ES6
๊ธฐ์กด ๋ฐฉ์๋ณด๋ค ๋จ์๋ช ๋ฃํ ์๋ก์ด ๋ฌธ๋ฒ์ผ๋ก Classํจ์๊ฐ ์ถ๊ฐ ๋์๋ค.
// ํด๋์ค ์ ์ธ๋ฌธ
class Person {
// constructor(์์ฑ์)
constructor(name) {
this._name = name;
}
sayHi() {
console.log(`Hi! ${this._name}`);
}
}
// ์ธ์คํด์ค ์์ฑ
const me = new Person('Lee');
me.sayHi(); // Hi! Lee
console.log(me instanceof Person); // true
(๋ํ ์ผํ ๋ด์ฉ์ ์ถ๊ฐ ๊ณต๋ถ๊ฐ ํ์ํ ๊ฒ๊ฐ๋ค.)
๋ชจ๋ (Module)
๋ชจ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๊ฐ๋ณ์ ์์๋ก์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์ฝ๋ ์กฐ๊ฐ์ ๋งํ๋ค.
๋ชจ๋์ ์ธ๋ถ ์ฌํญ์ ์บก์ํํ๊ณ ๊ณต๊ฐ๊ฐ ํ์ํ API๋ง์ ์ธ๋ถ์ ๋ ธ์ถํ๋ค.
๋ชจ๋์ ํ์ผ๋จ์๋ก ๋ถ๋ฆฌ๋์ด ์์ผ๋ฉฐ ํ์์ ๋ฐ๋ผ ๋ชจ๋์ ๋ก๋ํ์ฌ ์ฌ์ฌ์ฉํ๋ค.
script ํ๊ทธ์ type="module" ์ ์ถ๊ฐํ๋ฉด ๋ชจ๋๋ก์ ๋์ํ๋ค.
ES6 ๋ชจ๋์ ํ์ผ ํ์ฅ์๋ ๋ชจ๋์์ ๋ช ํํ๊ธฐ ์ํด mjs๋ฅผ ์ฌ์ฉํ๋๋ก ๊ถ์ฅํ๋ค.
<script type="module" src="lib.mjs"></script>
<script type="module" src="app.mjs"></script>
๋ชจ๋์ ๋ชจ๋ ์ค์ฝํ๋ฅผ ๊ฐ์ง๋ค.
๋ชจ๋ ๋ด์์ var ํค์๋๋ก ์ ์ธํ ๋ณ์๋ ๋์ด์ ์ ์ญ ๋ณ์๊ฐ ์๋๋ฉฐ
window ๊ฐ์ฒด ํ๋กํผ๋๋ ์๋๋ค.
// foo.mjs
var x = 'foo';
console.log(x); // foo
// ๋ณ์ x๋ ์ ์ญ ๋ณ์๊ฐ ์๋๋ฉฐ window ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค.
console.log(window.x); // undefined
// bar.mjs
// ๋ณ์ x๋ foo.mjs์์ ์ ์ธํ ๋ณ์ x์ ์ค์ฝํ๊ฐ ๋ค๋ฅธ ๋ณ์์ด๋ค.
var x = 'bar';
console.log(x); // bar
// ๋ณ์ x๋ ์ ์ญ ๋ณ์๊ฐ ์๋๋ฉฐ window ๊ฐ์ฒด์ ํ๋กํผํฐ๋ ์๋๋ค.
console.log(window.x); // undefined
<!DOCTYPE html>
<html>
<body>
<script type="module" src="foo.mjs"></script>
<script type="module" src="bar.mjs"></script>
</body>
</html>
Export: ์ธ๋ถ์ ๊ณต๊ฐํ์ฌ ๋ค๋ฅธ ๋ชจ๋๋ค์ด ์ฐธ์กฐํ ์ ์๊ฒํ๋ค.
// lib.mjs
const pi = Math.PI;
function square(x) {
return x * x;
}
class Person {
constructor(name) {
this.name = name;
}
}
// ๋ณ์, ํจ์ ํด๋์ค๋ฅผ ํ๋์ ๊ฐ์ฒด๋ก ๊ตฌ์ฑํ์ฌ ๊ณต๊ฐ
export { pi, square, Person };
Import: ๋ชจ๋์์ ๊ณต๊ฐํ (export)ํ ๋์์ ๋ก๋ํ๋ ค๋ฉด import ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
์๋์ import 3๊ฐ์ง ๋ฐฉ์์ ์ฐธ๊ณ ํ ์ ์๋ค.
// app.mjs
// ๊ฐ์ ํด๋ ๋ด์ lib.mjs ๋ชจ๋์ ๋ก๋.
// lib.mjs ๋ชจ๋์ด exportํ ์๋ณ์๋ก importํ๋ค.
// ES6 ๋ชจ๋์ ํ์ผ ํ์ฅ์๋ฅผ ์๋ตํ ์ ์๋ค.
import { pi, square, Person } from './lib.mjs'; // import ์ฒซ๋ฒ์งธ ๋ฐฉ์
import * as lib from './lib.mjs'; // import ๋๋ฒ์งธ ๋ฐฉ์
import { pi as PI, square as sq, Person as P } from './lib.mjs'; // import ์ธ๋ฒ์งธ ๋ฐฉ์
console.log(pi); // 3.141592653589793
console.log(square(10)); // 100
console.log(new Person('Lee')); // Person { name: 'Lee' }
<์ฐธ๊ณ ์ฉ>
lib.mjs / app.mjs / html ์์ import์ export ๋์ ์ฌ์ฉ๋ฐฉ๋ฒ
// lib.mjs
export default x => x * x;
// app.mjs
// ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ๋ชจ๋์ ํ์ผ ํ์ฅ์๋ฅผ ์๋ตํ ์ ์๋ค.
// ๋ชจ๋์ ํ์ผ ํ์ฅ์๋ .mjs๋ฅผ ๊ถ์ฅํ๋ค.
import square from './lib.mjs';
console.log(square(10)); // 100
<!DOCTYPE html>
<html>
<body>
<script type="module" src="./lib.js"></script>
<script type="module" src="./app.js"></script>
</body>
</html>
'๊ฐ๋ฐ ์ด์ผ๊ธฐ > ํญํด99' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํญํด99] 5์ฃผ์ฐจ - ORM(Object Relational Mapping)์ด๋? (0) | 2022.04.03 |
---|---|
[ํญํด99] 4์ฃผ์ฐจ - package.json์ด๋? (0) | 2022.03.27 |
[ํญํด99] 2์ฃผ์ฐจ - JWT(JSON Web Token)๋? (0) | 2022.03.13 |
[ํญํด99] ์์ ์ ์ฌ์ ์์ - 5์ฃผ์ฐจ: AWS์๋ฒ์ฐ๊ฒฐ, Gitbash, ๊ฐ๋น์ ๋๋ฉ์ธ์ฐ๊ฒฐ (0) | 2022.02.10 |
[ํญํด99] ์์ ์ ์ฌ์ ์์ - 4์ฃผ์ฐจ: flask, ํฌ๋กค๋ง, DB์ฐ๊ฒฐ (0) | 2022.02.09 |