let
๊ณผ const
๋ JavaScript์์ ๋น๊ต์ ์๋ก์ด ๋ ๊ฐ์ง ์ ํ์ ๋ณ์ ์ ์ธ์
๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด, let
์ var
์ ์ด๋ ์ ๋ ์ ์ฌํ์ง๋ง, ์ฌ์ฉ์๊ฐ JavaScript์์ ์์ฃผ ๋ง์ฃผ์น๋ ๊ฒฐํจ์ ํผํ ์ ์๊ฒ ํด์ค๋๋ค.
const
๋ let
์ ๊ธฐ๋ฅ์ด ๊ฐํ๋ ๊ฒ์ผ๋ก ๋ณ์์ ์ฌํ ๋น์ ๋ฐฉ์งํฉ๋๋ค.
TypeScript๋ JavaScript์ ์์ ์งํฉ์ด๋ฏ๋ก, ๋น์ฐํ let
๊ณผ const
๋ฅผ ์ง์ํฉ๋๋ค.
์ฌ๊ธฐ์๋ ์๋ก์ด ์ ์ธ ๋ฐฉ์๋ค๊ณผ ์ ๊ทธ ๋ฐฉ์๋ค์ด var
๋ณด๋ค ์ ํธ๋๋์ง๋ฅผ ๋ ์์ธํ ์ค๋ช
ํฉ๋๋ค.
JavaScript๋ฅผ ์๋ฌด๋ ๊ฒ๋ ์ฌ์ฉํ๊ณ ์์๋ค๋ฉด, ๋ค์ ์น์
์ด ๊ธฐ์ต์ ์๋ก ๊ณ ์น๋๋ก ๋์์ค ๊ฒ์
๋๋ค.
JavaScript์์ var
์ ์ธ์ ๋จ์ ๋ค์ ๋ํด ๋ชจ๋ ์๊ณ ์๋ค๋ฉด ์ฝ๊ฒ ๋์ด๊ฐ ์ ์์ต๋๋ค.
๊ธฐ์กด JavaScript์์๋ ๋ณ์ ์ ์ธ์ ํ ๋ var
ํค์๋๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
var a = 10;
์๋ค์ํผ, a
๋ผ๋ ๋ณ์๋ฅผ 10
์ด๋ผ๋ ๊ฐ์ผ๋ก ์ ์ธํ์ต๋๋ค.
๋ํ, ๋ณ์๋ฅผ ํจ์ ๋ด๋ถ์ ์ ์ธํ ์๋ ์์ต๋๋ค.
function f() {
var message = "Hello, world!";
return message;
}
๊ทธ๋ฆฌ๊ณ , ๊ฐ์ ๋ณ์๋ฅผ ๋ค๋ฅธ ํจ์ ์์์ ์ ๊ทผํ ์๋ ์์ต๋๋ค.
function f() {
var a = 10;
return function g() {
var b = a + 1;
return b;
}
}
var g = f();
g(); // '11'์ ๋ฐํ
์ ์์ ์์, g
๋ f
์์ ์ ์ธ๋ a
๋ฅผ ์ก์ ๋ก๋๋ค.
์ธ์ ๋ g
๊ฐ ํธ์ถ๋ ๋, a
์ ๊ฐ์ f
์์ a
๊ฐ์ ๊ฐ๋ฆฌํต๋๋ค.
f
๊ฐ ์คํ๋๋ฉด์ g
๊ฐ ํ๋ฒ ํธ์ถ๋ ํ์๋, a
์ ์ ๊ทผํด ์์ ํ ์ ์์ต๋๋ค.
function f() {
var a = 1;
a = 2;
var b = g();
a = 3;
return b;
function g() {
return a;
}
}
f(); // '2' ๋ฐํ
var
์ ์ธ์ ๋ค๋ฅธ ์ธ์ด์ ๋ค๋ฅธ ์ด์ํ ์ค์ฝํ ๊ท์น๋ค์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์๋ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
function f(shouldInitialize: boolean) {
if (shouldInitialize) {
var x = 10;
}
return x;
}
f(true); // '10' ๋ฐํ
f(false); // 'undefined' ๋ฐํ
์ด ์์ ์์, ์ด๋ค ๋ถ๋ค์ ๋จธ๋ญ๊ฑฐ๋ฆด ์๋ ์์ต๋๋ค.
๋ณ์ x
๋ if
๋ธ๋ก ์์ ์ ์ธ๋์ด ์์ง๋ง, ๋ธ๋ก์ ๋ฐ๊นฅ์์๋ ์ด ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ด ์ด์ ๋ var
์ ์ธ์ ์ด๋ฅผ ๊ฐ์ธ๊ณ ์๋ ๋ธ๋ก๊ณผ ๊ด๊ณ์์ด ์ด๋ฅผ ๊ฐ์ธ๊ณ ์๋ ํจ์, ๋ชจ๋, ๋ค์์คํ์ด์ค, ์ ์ญ ์ค์ฝํ์์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด๋ค ์ด๋ ์ด๋ฅผ var
-์ค์ฝํ ํน์ ํจ์ ์ค์ฝํ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๋งค๊ฐ ๋ณ์ ๋ํ ํจ์ ์ค์ฝํ์
๋๋ค.
์ด๋ฐ ์ค์ฝํ ๊ท์น์ ๋ช ๊ฐ์ง ์ค์๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋์ฑ ๋ฌธ์ ๋ฅผ ์ฌ๊ฐํ๊ฒ ํ๋ ๊ฒ์ ๋ณ์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ ์ธํ๋ ๊ฒ์ด ์๋ฌ๊ฐ ์๋๋ผ๋ ๊ฒ์ ๋๋ค:
function sumMatrix(matrix: number[][]) {
var sum = 0;
for (var i = 0; i < matrix.length; i++) {
var currentRow = matrix[i];
for (var i = 0; i < currentRow.length; i++) {
sum += currentRow[i];
}
}
return sum;
}
์๋ง ์ฝ๊ฒ ์ฐพ์ ์ ์๊ฒ ์ง๋ง, i
๊ฐ ๊ฐ์ ํจ์ ์ค์ฝํ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ for
-loop ์์์ ์ค์๋ก ๋ณ์ i
๋ฅผ ๋ฎ์ด์ธ ์๋ ์์ต๋๋ค
๊ฒฝํ ๋ง์ ๊ฐ๋ฐ์๋ ๋ฐ๋ก ์์์ฐจ๋ฆฌ๊ฒ ์ง๋ง, ๋น์ทํ ์ข
๋ฅ์ ๋ฒ๊ทธ๋ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์น๋ฉฐ ์ข์ ์ ์์ธ์ด ๋๊ธฐ๋ ํฉ๋๋ค.
๋ค์ ์ฝ๋์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์์ํด ๋ณด์ธ์:
for (var i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
์ต์ํ์ง ์์ ๋ถ๋ค์ ์ํด ๋ง์๋๋ฆฌ์๋ฉด, setTimeout
์ ํน์ ๋ฐ๋ฆฌ ์ด ํ์ ํจ์๋ฅผ ์คํํฉ๋๋ค.(๋ค๋ฅธ ์์
์ ์คํ์ด ๋ฉ์ถ๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ๋ฉฐ)
์ค๋น๋๋์? ์ดํด๋ณด๊ฒ ์ต๋๋ค:
10
10
10
10
10
10
10
10
10
10
๋ง์ JavaScript ๊ฐ๋ฐ์๋ค์ ์ด๋ฐ ๋์์ ์ต์ํ ํธ์ด์ง๋ง, ๋ง์ฝ ๋๋๋๋ผ๋ ๋น์ ํผ์๋ง ๋๋ ๊ฒ์ ์๋๋๋ค. ๋ง์ ์ฌ๋๋ค์ด ์ถ๋ ฅ ๊ฒฐ๊ณผ๊ฐ ๋ค์๊ณผ ๊ฐ์ ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
0
1
2
3
4
5
6
7
8
9
์์ ๋ณ์ ์บก์ณ๋ง์ ๋ํด ์ธ๊ธํ๋ ๋ถ๋ถ์ ๊ธฐ์ตํ๋์?
setTimout
์ ์ ๋ฌํ๋ ๋ชจ๋ ํจ์ ํํ์์ ์ฌ์ค ๊ฐ์ ์ค์ฝํ์์ ๊ฐ์ i
๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
์ ์, ์ด๊ฒ ๋ฌด์จ ๋ป์ธ์ง ์๊ฐํด ๋ณด์ธ์.
setTimeout
์ ํจ์๋ฅผ ๋ช ๋ฐ๋ฆฌ ์ด ํ์ ์คํ ์ํค๊ฒ ์ง๋ง. ํญ์for
๋ฃจํ๊ฐ ์คํ์ ๋ฉ์ถ๊ณ ๋ ๋ค์ ์คํ๋ฉ๋๋ค.
for
๋ฃจํ๊ฐ ์คํ์ ์ค์งํ์ ๋, i
์ ๊ฐ์ 10
์
๋๋ค.
๋ฐ๋ผ์ ๋งค๋ฒ ์ฃผ์ด์ง ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค 10
์ ์ถ๋ ฅํ ๊ฒ์
๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ด๋ฅผ ๋์ํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ์ฆ์ ์คํ ํจ์(IIFE - an Immediately Invoked Function Expression)๋ฅผ ์ฌ์ฉํด ๋งค ๋ฐ๋ณต๋ง๋ค i
๋ฅผ ์ก์๋๋ ๊ฒ์
๋๋ค:
for (var i = 0; i < 10; i++) {
// ํ์ฌ ๊ฐ์ผ๋ก ํจ์๋ฅผ ํธ์ถ์์ผ
// ํ์ฌ ์ํ์ 'i'๋ฅผ ์ก์๋๋ค.
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}
์ด๋ฐ ์ด์ํด ๋ณด์ด๋ ํจํด์ด ์ฌ์ค ์ผ๋ฐ์ ์ธ ํจํด์
๋๋ค.
๋งค๊ฐ๋ณ์์ i
๊ฐ for
๋ฃจํ์ i
๋ฅผ ๊ฐ์ถฐ ๋ฒ๋ฆฝ๋๋ค. ํ์ง๋ง ์ด๋ฆ์ ๊ฐ๊ฒ ํ๊ธฐ ๋๋ฌธ์ ๋ฃจํ์ ์คํ ๋ถ๋ฅผ ํฌ๊ฒ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.
์ด์ , var
์ ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ ๋ํด ์๊ฒ ๋์๋๋ฐ, ์ด๋ฐ ์ด์ ๋๋ฌธ์ let
์ ๋์
ํ๊ฒ ๋์์ต๋๋ค.
์ฌ์ฉ๋๋ ํค์๋๋ฅผ ๋นผ๊ณ ๋ let
๋ฌธ์ var
์ ๋์ผํ ๋ฐฉ๋ฒ์ผ๋ก ์์ฑ๋ฉ๋๋ค.
let hello = "Hello!";
์ฃผ์ํ ์ฐจ์ด์ ์ ๊ตฌ๋ฌธ ๋ณด๋จ ์๋ฏธ์ ์๋๋ฐ, ์ด์ ์ด ๋ด์ฉ์ ์ดํด๋ณผ ๊ฒ์ ๋๋ค.
๋ณ์๊ฐ let
์ ์ด์ฉํด ์ ์ธ๋์์ ๋, ์ด๋ ๋ ์์ปฌ ์ค์ฝํ(lexical-scoping) ํน์ ๋ธ๋ก ์ค์ฝํ(block-scoping) ์ด๋ผ ๋ถ๋ฆฌ๋ ๊ฒ์ ์ฌ์ฉํฉ๋๋ค.
var
๋ก ์ ์ธ๋ ๋ณ์๊ฐ ์ด๋ฅผ ํฌํจํ ํจ์๊น์ง ํ๋ฌ๋์ค๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, ๋ธ๋ก-์ค์ฝํ ๋ณ์๋ค์ ์ด๋ฅผ ๊ฐ์ฅ ๊ฐ๊น๊ฒ ๊ฐ์ธ๊ณ ์๋ ๋ธ๋ก ํน์ for
-๋ฃจํ ๋ฐ์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
function f(input: boolean) {
let a = 100;
if (input) {
// 'a'๋ฅผ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
let b = a + 1;
return b;
}
// ์ค๋ฅ: 'b'๋ ์ฌ๊ธฐ์ ์กด์ฌํ์ง ์์ต๋๋ค.
return b;
}
์ฌ๊ธฐ, ๋ ์ง์ญ ๋ณ์ a
์ b
๊ฐ ์์ต๋๋ค.
a
์ ์ค์ฝํ๋ f
์ ๋ธ๋ก์ผ๋ก ํ์ ๋์ง๋ง, b
๋ ์ด๋ฅผ ๊ฐ์ธ๊ณ ์๋ if
๋ฌธ์ ๋ธ๋ก๊น์ง๋ก ํ์ ๋ฉ๋๋ค.
catch
๋ฌธ์ ์ ์ธ๋ ๋ณ์ ๋ํ ๋น์ทํ ์ค์ฝํ ๊ท์น์ ๊ฐ์ง๋๋ค.
try {
throw "oh no!";
}
catch (e) {
console.log("Oh well.");
}
// ์ค๋ฅ: 'e'๋ ์ฌ๊ธฐ์ ์กด์ฌํ์ง ์์ต๋๋ค.
console.log(e);
๋ ๋ค๋ฅธ ๋ธ๋ก-์ค์ฝํ ๋ณ์์ ํน์ง์ ๋ณ์๋ค์ด ์ ์ธ๋๊ธฐ ์ ์ ์ฝ๊ฑฐ๋, ์ฐ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์
๋๋ค.
์ด ๋ณ์๋ค์ ์ค์ฝํ์ ๊ฑธ์ณ "์กด์ฌ"ํ์ง๋ง, ์ ์ธ๋๋ ๋ถ๋ถ ์ ๊น์ง ๋ชจ๋ ๋ถ๋ถ๋ค์ด temploral dead zone์
๋๋ค.
์ด๊ฒ์ let
๋ฌธ ์ด์ ์ ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋ค๋ ์ ๊ตํ ๋ฐฉ์์ด๋ฉฐ, ๋คํํ TypeScript๊ฐ ์๋ ค์ค๋๋ค.
a++; // `a`๊ฐ ์ ์ธ๋๊ธฐ ์ ์ ์๋ชป๋ ์ฌ์ฉ.
let a;
์ฃผ์ํ ์ ์ ์ฌ์ ํ ์ ์ธ๋๊ธฐ ์ ์ ๋ธ๋ก-์ค์ฝํ ๋ณ์๋ฅผ ์ก์๋ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ ์ธ๋๊ธฐ ์ ์ ํจ์๋ฅผ ์คํํ๋ ๊ฒ์ด ์๋ ๋ค๋ ๊ฒ๋ง ์์๋๋ฉด ๋ฉ๋๋ค. ES2015๋ฅผ ๋์์ผ๋กํ, ์ต์ ๋ฐํ์์ ์ค๋ฅ๋ฅผ ๋์ง ๊ฒ์ ๋๋ค; ํ์ง๋ง ํ์ฌ TypeScript์์๋ ํ์ฉ๋๋ฉฐ, ์ค๋ฅ๋ฅผ ๋ณด๊ณ ํ์ง ์์ต๋๋ค.
function foo() {
// 'a' ์บก์ฒ๋ ์ฑ๊ณต
return a;
}
// `a`๊ฐ ์ ์ธ๋๊ธฐ ์ ์ `foo` ๋ฅผ ํธ์ถ
// ๋ฐํ์์ ์ค๋ฅ๋ฅผ ๋์ง ๊ฒ ์
๋๋ค.
foo();
let a;
temporal dead zone์ ๋ ์์ธํ ์ค๋ช ์ Mozilla Developer Network๋ฅผ ์ดํด๋ณด์ธ์.
var
๋ก ์ ์ธํ๋ฉด ์ผ๋ง๋ ๋ณ์๋ฅผ ๋ง์ด ์ ์ธํ๋์ง๋ ์ค์ํ์ง ์๋ค๊ณ ํ์ต๋๋ค. ๋จ ํ๋๋ง ์์ฑ๋ฉ๋๋ค.
function f(x) {
var x;
var x;
if (true) {
var x;
}
}
์ ์์ ๋ฅผ ๋ณด๋ฉด ๋ชจ๋ x
์ ์ ์ธ์ ์ฌ์ค ๊ฐ์ x
๋ฅผ ๊ฐ๋ฅด์น๋ฉฐ, ์ด๋ ์ ํจํฉ๋๋ค.
์ด๊ฑด ์ข
์ข
๋ฒ๊ทธ์ ์์ธ์ด ๋ฉ๋๋ค.
๊ณ ๋ง๊ฒ๋, let
์ ์ธ์ ์ด๊ฒ์ ํ์ฉํ์ง ์์ต๋๋ค.
let x = 10;
let x = 20; // ์ค๋ฅ: 'x'๋ฅผ ๊ฐ์ ์ค์ฝํ์ ์ ์ธํ ์ ์์ต๋๋ค.
TypeScript๊ฐ ๋ฌธ์ ๋ฅผ ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์, ๋ณ์๋ฅผ ๋ฐ๋์ ๋ธ๋ก ๋ฒ์๋ก ์ง์ ํ ํ์๋ ์์ต๋๋ค.
function f(x) {
let x = 100; // ์ค๋ฅ: ๋งค๊ฐ ๋ณ์ ์ ์ธ์ ๋ฐฉํดํฉ๋๋ค.
}
function g() {
let x = 100;
var x = 100; // ์ค๋ฅ: `x`๋ฅผ ์ค๋ณตํด์ ์ ์ธํ ์ ์์ต๋๋ค.
}
๋ธ๋ก-์ค์ฝํ ๋ณ์๊ฐ ํจ์-์ค์ฝํ ๋ณ์๋ก ์ ์ธ๋ ์ ์๋ค๋ ๊ฒ์ ์๋๋๋ค. ๋ธ๋ก ์ค์ฝํ ๋ณ์๋ ๋จ์ง ๋ณ๊ฐ์ ๋ค๋ฅธ ๋ธ๋ก์ ์ ์ธ๋์ด์ผ ํฉ๋๋ค.
function f(condition, x) {
if (condition) {
let x = 100;
return x;
}
return x;
}
f(false, 0); // '0' ๋ฐํ
f(true, 0); // '100' ๋ฐํ
๋ ์ค์ฒฉ๋ ์ค์ฝํ์์ ๋ฐ๊นฅ ์ค์ฝํ์ ๋ณ์ ์ด๋ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ shadowing์ด๋ผ๊ณ ํฉ๋๋ค.
shadowing์ ์๋ ์ ๊ฒ์ด๋ผ๊ณ ํ ์ ์๋๋ฐ, ์ด๋ ์ค์๋ก ๋ฐฉ์๋์ด ํน์ ๋ฒ๊ทธ๋ฅผ ์ผ์ผํค๊ฑฐ๋, ํน์ ํน์ ๋ฒ๊ทธ๋ฅผ ๋ง๊ธฐ ์ํด ์ฐ์ด๊ธฐ ๋๋ฌธ์
๋๋ค.
์๋ฅผ ๋ค์ด, ์์์ ์ฌ์ฉํ๋ sumMatrix
ํจ์๋ฅผ let
์ ์ด์ฉํด์ ์์ฑํ๋ค๊ณ ์๊ฐํด ๋ด
์๋ค.
function sumMatrix(matrix: number[][]) {
let sum = 0;
for (let i = 0; i < matrix.length; i++) {
var currentRow = matrix[i];
for (let i = 0; i < currentRow.length; i++) {
sum += currentRow[i];
}
}
return sum;
}
์ด ๋ฃจํ๋ ํฉ์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ณ์ฐํ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด ์์ชฝ ๋ฃจํ์ i
๊ฐ ๋ฐ๊นฅ ๋ฃจํ์ i
๋ฅผ ๊ฐ๋ฆฌ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ณดํต ๋ ๋ช ํํ ์ฝ๋ ์์ฑ์ ์ํด shadowing ์ฌ์ฉ์ ํผํฉ๋๋ค. ํ์ง๋ง shadowing์ ์ด์ ์ ํ์ฉํ ์ ์๋ ์ ํฉํ ์ํฉ์ด ์์ผ๋ฏ๋ก, ์ต์ ์ ํ๋จ์ ๋ด๋ ค์ผ ํฉ๋๋ค.
var
์ ์ธ์ ๋ณ์ ์บก์ณ๋ง์ ํ๋ ๊ฒ์ ์ฒ์ ๋ณด์์ ๋, ๋ณ์๊ฐ ํ๋ฒ ์บก์ณ๋๋ฉด ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ฐ๋จํ ์ดํด๋ณด์์ต๋๋ค.
์ด๋ฅผ ๋ ์ ์ดํดํด ๋ณด๋ฉด, ์ค์ฝํ๊ฐ ๊ฐ๊ฐ ์คํ๋ ๋๋ง๋ค ๋ณ์์ "ํ๊ฒฝ"์ ๋ง๋ญ๋๋ค.
๋ณ์์ ํ๊ฒฝ๊ณผ ์บก์ณ๋ ๋ณ์๋ค์ ์ฌ์ง์ด ์ค์ฝํ๊ฐ ํฌํจํ ๋ชจ๋ ๊ฒ์ด ์คํ์ ์ข
๋ฃํ ํ์๋ ์กด์ฌํฉ๋๋ค.
function theCityThatAlwaysSleeps() {
let getCity;
if (true) {
let city = "Seattle";
getCity = function() {
return city;
}
}
return getCity();
}
city
๋ฅผ ํด๋น ํ๊ฒฝ ์์ ์บก์ณํ๊ธฐ ๋๋ฌธ์, if
๋ธ๋ก์ ์คํ์ด ์๋ฃ๋์์์๋ ์ฌ์ ํ city
์ ์ ๊ทผํ ์ ์์ต๋๋ค.
์์ setTimeout
์์ ์์, for
๋ฃจํ๊ฐ ๋งค๋ฒ ๋ฐ๋ณต๋ ๋๋ง๋ค ๋ณ์๋ฅผ ์บก์ณํ๊ธฐ ์ํด์ IIFE๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ ์ฌ๋ ค ๋ด
์๋ค.
์ค์ ๋ก , ์บก์ฒ๋ ๋ณ์๋ฅผ ์ํด ์๋ก์ด ๋ณ์ ํ๊ฒฝ์ ๋ง๋๋ ๊ฒ์ด์์ต๋๋ค.
์ด๋ ์ฝ๊ฐ์ ๊ณ ํต์ค๋ฌ์ด ์ผ์ด์ง๋ง, ๋คํํ, ํ์
์คํฌ๋ฆฝํธ ์์๋ ๊ทธ๋ ๊ฒ ํ ํ์๊ฐ ์์ต๋๋ค.
let
์ ์ธ์ ๋ฃจํ์ ์ผ๋ถ๋ก ์ ์ธ๋ ๋ ๋์์ด ํฌ๊ฒ ๋ค๋ฆ
๋๋ค.
์ด ์ ์ธ์ ๋ฃจํ ์์ฒด์ ์๋ก์ด ํ๊ฒฝ์ ๋ง๋๋ ๋์ , ๋ฐ๋ณต๋ง๋ค
์๋ก์ด ํ๊ฒฝ์ ๋ง๋ค์ด ๋
๋๋ค.
์ด์จ๋ ์ด๊ฑด IIFE๋ฅผ ํตํด ํ๊ณ ์์๋ ๋์์ด๋ฏ๋ก, ์ด์ setTimeout
์์ ๋ฅผ let
์ ์ธ๋ง ์ฌ์ฉํด์ ๋ฐ๊ฟ์ ์์ต๋๋ค.
for (let i = 0; i < 10 ; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
๊ทธ๋ฆฌ๊ณ ์์ ํ๋ ๋๋ก, ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
0
1
2
3
4
5
6
7
8
9
const
์ ์ธ์ ๋ณ์๋ฅผ ์ ์ธํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์
๋๋ค.
const numLivesForCat = 9;
์ด ๋ฐฉ๋ฒ์ let
์ ์ธ๊ณผ ๋น์ทํ์ง๋ง ๊ทธ ์ด๋ฆ์์ ๋งํด์ฃผ๋ฏ์ด, ์ผ๋จ ๋ฐ์ธ๋ฉ ๋๋ฉด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ง๋ก const
๋ let
๊ณผ ๊ฐ์ ์ค์ฝํ ๊ท์น์ ๊ฐ์ง๊ณ ์์ง๋ง, ์ฌํ ๋น ํ ์ ์์ต๋๋ค.
์ด๋ฅผ const
๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ด ๋ถ๋ณ์ด๋ผ๊ณ ํผ๋ํ๋ฉด ์ ๋ฉ๋๋ค.
const numLivesForCat = 9;
const kitty = {
name: "Aurora",
numLives: numLivesForCat,
}
// ์ค๋ฅ
kitty = {
name: "Danielle",
numLives: numLivesForCat
};
// ๋ชจ๋ "์ฑ๊ณต"
kitty.name = "Rory";
kitty.name = "Kitty";
kitty.name = "Cat";
kitty.numLives--;
์์ ๊ฐ์ ์ํฉ์ ํผํ๊ธฐ ์ํด ํน๋ณํ ์กฐ์น๋ฅผ ์ทจํ์ง ์๋ ํ, const
๋ณ์์ ๋ด๋ถ ์ํ๋ ์ฌ์ ํ ์์ ๊ฐ๋ฅํฉ๋๋ค.
๋คํํ, TypeScript๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด์ ๋ฉค๋ฒ๊ฐ ์ฝ๊ธฐ ์ ์ฉ(readonly)
์ด๋ผ๊ณ ์ง์ ํ ์ ์์ต๋๋ค.
Interfaces ์ฑํฐ์ ์์ธํ ์ค๋ช
๋์ด ์์ต๋๋ค.
์ ์ฌํ ์ค์ฝํ์ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ๋ ๊ฐ์ง ์ ํ์ ๋ณ์ ์ ์ธ์ด ์๊ธฐ ๋๋ฌธ์, ์ด๋ ๊ฒ์ ์ฌ์ฉํ๋์ง๋ ์ค์ค๋ก ์ ํํด์ผ ํฉ๋๋ค. ๊ด๋ฒ์ํ ์ง๋ฌธ์ฒ๋ผ, ๋ต์ '๋์ ๋ฐ๋ผ ๋ค๋ฅด๋ค'์ ๋๋ค.
์ต์ ๊ถํ์ ์์น์ ์ ์ฉํ๋ฉด, ์์ ํ๋ ค๋ ์ ์ธ ์ด์ธ์ ๋ชจ๋ ์ ์ธ์ const
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ทธ ์ด์ ๋, ๋ง์ฝ ๋ณ์๊ฐ ์์ ๋ ํ์๊ฐ ์๋ค๋ฉด ๊ฐ์ ์ฝ๋๋ฒ ์ด์ค์์ ์์
ํ๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์๋์ผ๋ก ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์์ด์ผ ํ๊ณ , ๊ทธ๋ค์ด ์ ๋ง ๋ณ์์ ์ฌํ ๋นํ ํ์๊ฐ ์๋์ง ๊ณ ๋ คํ ํ์๊ฐ ์์ต๋๋ค.
const
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ถ๋ก ํ ๋ ์ฝ๋๋ฅผ ๋ ์์ธกํ๊ธฐ ์ฝ๊ฒ ํด์ค๋๋ค.
์ต์ ์ ํ๋จ์ ํ๊ณ ํด๋น๋๋ ๊ฒฝ์ฐ, ํ์๋ค๊ณผ ๋ฌธ์ ์ ๋ํด ์์ํ์ธ์.
์ด ํธ๋๋ถ์ ๋๋ถ๋ถ let
์ ์ธ์ ์ฌ์ฉํฉ๋๋ค.
TypeScript๊ฐ ๊ฐ์ง ๋ ๋ค๋ฅธ ECMAScript 2015 ํน์ง์ ๊ตฌ์กฐ ๋ถํด์ ๋๋ค. ์์ธํ ๋ด์ฉ์, Mozilla Developer Network์ ๊ธ์ ์ฐธ๊ณ ํ์ธ์. ์ด๋ฒ ์น์ ์์๋ ๊ฐ๋จํ๊ฒ ๊ฐ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ตฌ์กฐ ๋ถํด์ ๊ฐ์ฅ ๋จ์ํ ํํ๋ ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ๋๋ค:
let input = [1, 2];
let [first, second] = input;
console.log(first); // 1 ์ถ๋ ฅ
console.log(second); // 2 ์ถ๋ ฅ
์ด๋ first
, second
๋ผ๋ ์ด๋ฆ์ ์๋ก์ด ๋ ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค.
์ด๋ ์ธ๋ฑ์ฑ์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ์ง๋ง ๋ ํธ๋ฆฌํฉ๋๋ค:
first = input[0];
second = input[1];
๊ตฌ์กฐ ๋ถํด ํ ๋น์ ์ด๋ฏธ ์ ์ธ๋ ๋ณ์์๋ ๋์ํฉ๋๋ค:
// ๋ณ์๋ฅผ ์ค์
[first, second] = [second, first];
๊ทธ๋ฆฌ๊ณ , ํจ์์ ๋งค๊ฐ๋ณ์์๋ ๋์ํฉ๋๋ค:
function f([first, second]: [number, number]) {
console.log(first);
console.log(second);
}
f([1, 2]);
๋๋จธ์ง ์์๋ค์ ๋ํด ...
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค:
let [first, ...rest] = [1, 2, 3, 4];
console.log(first); // 1 ์ถ๋ ฅ
console.log(rest); // [ 2, 3, 4 ] ์ถ๋ ฅ
๋ฌผ๋ก JavaScript์ด๊ธฐ ๋๋ฌธ์, ํ์ํ์ง ์์ ๋ค๋ฐ๋ผ ์ค๋ ์์๋ค์ ๋ฌด์ํ ์ ์์ต๋๋ค:
let [first] = [1, 2, 3, 4];
console.log(first); // 1 ์ถ๋ ฅ
๋๋ ๊ทธ ๋ฐ์ ์์๋ค์ ๋ฌด์ํ ์ ์์ต๋๋ค:
let [, second, , fourth] = [1, 2, 3, 4];
console.log(second); // 2 ์ถ๋ ฅ
console.log(fourth); // 4 ์ถ๋ ฅ
ํํ์ ๋ฐฐ์ด์ฒ๋ผ ๊ตฌ์กฐ ๋ถํด๋ฉ๋๋ค; ๊ตฌ์กฐ ๋ถํด๋ ๋ณ์๋ ํํ ์์์ ์ผ์นํ๋ ํ์ ์ ์ป๊ฒ ๋ฉ๋๋ค:
let tuple: [number, string, boolean] = [7, "hello", true];
let [a, b, c] = tuple; // a: number, b: string, c: boolean
ํํ์ ๋ฒ์๋ฅผ ๋์ด์ ๊ตฌ์กฐ ๋ถํด๋ ์ค๋ฅ์ ๋๋ค:
let [a, b, c, d] = tuple; // ์ค๋ฅ, ์ธ๋ฑ์ค 3์ ์์๊ฐ ์์ต๋๋ค.
๋ฐฐ์ด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ ์งง์ ํํ์ ์ป๊ธฐ ์ํด ...
๋ก ํํ์ ๋๋จธ์ง๋ฅผ ๊ตฌ์กฐ ๋ถํดํ ์ ์์ต๋๋ค.
let [a, ...bc] = tuple; // bc: [string, boolean]
let [a, b, c, ...d] = tuple; // d: [], ๋น์ด์๋ ํํ
๋๋ ๋ค๋ฐ๋ผ ์ค๋ ์์๋ ๋ค๋ฅธ ์์๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค:
let [a] = tuple; // a: number
let [, b] = tuple; // b: string
๋ํ ๊ฐ์ฒด๋ฅผ ๊ตฌ์กฐ ๋ถํดํ ์ ์์ต๋๋ค:
let o = {
a: "foo",
b: 12,
c: "bar"
};
let { a, b } = o;
์ด๋ o.a
, o.b
๋ก ๋ถํฐ ์๋ก์ด ๋ณ์ a
์ b
๋ฅผ ์์ฑํฉ๋๋ค.
ํ์ ์๋ค๋ฉด c
๋ฅผ ๊ฑด๋ ๋ธ ์ ์๋ค๋ ๊ฑธ ์์๋์ธ์.
๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด์ฒ๋ผ, ์ ์ธ ์์ด ํ ๋นํ ์ ์์ต๋๋ค.:
({ a, b } = { a: "baz", b: 101 });
์ด ๊ตฌ๋ฌธ์ ๊ดํธ๋ก ๊ฐ์ธ๊ณ ์๋ค๋ ๊ฒ์ ์ฃผ์ํด ์ฃผ์ธ์.
JavaScript๋ ๋ณดํต {
๋ฅผ ๋ธ๋ก์ ์์์ผ๋ก ํ์ฑ ํฉ๋๋ค.
๊ฐ์ฒด ์์ ๋๋จธ์ง ์์๋ค์ ...
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ณ์๋ก ์์ฑํ ์ ์์ต๋๋ค:
let { a, ...passthrough } = o;
let total = passthrough.b + passthrough.c.length;
ํ๋กํผํฐ๋ค์ ๋ค๋ฅธ ์ด๋ฆ์ ๋ถํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
let { a: newName1, b: newName2 } = o;
์ฌ๊ธฐ์ ๊ตฌ๋ฌธ์ด ํผ๋์ค๋ฌ์์ง๊ธฐ ์์ํฉ๋๋ค.
a: newName1
ย ์ "a
๋ฅผ newName1
๋ก" ์ ๊ฐ์ด ์ฝ์ ์ ์์ต๋๋ค.
์ฌํ ์จ์๋ ๊ฒ ์ฒ๋ผ ๋ฐฉํฅ์ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์
๋๋ค:
let newName1 = o.a;
let newName2 = o.b;
ํผ๋์ค๋ฝ๊ฒ๋ ์ฌ๊ธฐ์ ์ฝ๋ก ์ ํ์ ์ ๋ํ๋ด์ง ์์ต๋๋ค. ํ์ ์ ์ง์ ํ๋ ๊ฒฝ์ฐ, ์ ์ฒด ๊ตฌ์กฐ ๋ถํด ๋ค์ ์์ฑํด์ผ ํฉ๋๋ค:
let { a, b }: { a: string, b: number } = o;
๊ธฐ๋ณธ ๊ฐ์ ํ๋กํผํฐ๊ฐ ์ ์๋์ง ์์์ ๋ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค:
function keepWholeObject(wholeObject: { a: string, b?: number }) {
let { a, b = 1001 } = wholeObject;
}
์์ ์์ b?
๋ b
๊ฐ ์ ํ์ ์ด๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ์ด๋ undefined
์ผ ์๋ ์์ต๋๋ค.
keepWholeObject
๋ ์ด์ b
๊ฐ undefined ์ด๋๋ผ๋ a
, b
ํ๋กํผํฐ์ ํจ๊ป wholeObject
๋ผ๋ ๋ณ์๋ฅผ ๊ฐ์ง๋๋ค.
๊ตฌ์กฐ ๋ถํด๋ ํจ์ ์ ์ธ์์๋ ๋์ํฉ๋๋ค. ์ด๊ฒ์ ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ์ง๊ด์ ์ ๋๋ค:
type C = { a: string, b?: number }
function f({ a, b }: C): void {
// ...
}
๊ทธ๋ฌ๋ ๋งค๊ฐ ๋ณ์์๋ ๊ธฐ๋ณธ๊ฐ์ ๋ช ์ํ๋ ๊ฒ์ด ๋ ์ผ๋ฐ์ ์ด๋ฉฐ, ๊ตฌ์กฐ ๋ถํด์ ํจ๊ป ๊ธฐ๋ณธ๊ฐ์ ์ ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊น๋ค๋ก์ธ ์ ์์ต๋๋ค. ๊ฐ์ฅ ๋จผ์ , ๊ตฌ์กฐ ๋ถํด ํจํด์ ๊ธฐ๋ณธ๊ฐ ์์ ๋ฃ์ด์ผ ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.
function f({ a="", b=0 } = {}): void {
// ...
}
f();
์ ์ฝ๋๋ ํ์ ์ถ๋ก ์ ์์ ์ด๋ฉฐ ์ดํ ํธ๋๋ถ์์ ์ค๋ช ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์, ์ ํ์ ํ๋กํผํฐ๋ฅผ ์ํด ๊ธฐ๋ณธ ์ด๊ธฐํ ๋์ ๊ตฌ์กฐ ๋ถํด๋ ํ๋กํผํฐ์ ๊ธฐ๋ณธ ๊ฐ์ ์ฃผ์ด์ผ ํ๋ค๋ ๊ฑธ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.
C
๊ฐ b
๋ฅผ ์ ํ์ ์ผ๋ก ์ ์ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์:
function f({ a, b = 0 } = { a: "" }): void {
// ...
}
f({ a: "yes" }); // ์ฑ๊ณต, ๊ธฐ๋ณธ๊ฐ์ผ๋ก b = 0 ์
๋๋ค.
f(); // ์ฑ๊ณต, ๊ธฐ๋ณธ ๊ฐ์ { a: "" } ์ด๊ณ b = 0 ์
๋๋ค.
f({}); // ์ค๋ฅ, ๋งค๊ฐ ๋ณ์๊ฐ ์ฃผ์ด์ง๋ฉด `a`๊ฐ ํ์ํฉ๋๋ค.
๊ตฌ์กฐ ๋ถํด๋ฅผ ์ฃผ์ํด์ ์ฌ์ฉํ์ธ์. ์์ ์์ ์์ ์ ์ ์๋ฏ์ด, ๊ฐ์ฅ ๊ฐ๋จํ ๊ตฌ์กฐ ๋ถํด ํํ์ ์ด์ธ์ ๊ฒ๋ค์ ํผ๋์ค๋ฝ์ต๋๋ค. ์ฌ์ง์ด ์ด๋ฆ ๋ณ๊ฒฝ, ๊ธฐ๋ณธ๊ฐ, ํ์ ํ์๊ฐ ์๋๋ผ๋ ๊น๊ฒ ์ค์ฒฉ๋ ๊ตฌ์กฐ ๋ถํด๋ ์ ๋ง ์ดํดํ๊ธฐ๊ฐ ํ๋ญ๋๋ค. ๊ตฌ์กฐ ๋ถํด ํํ์์ ์๊ณ ๊ฐ๋จํ๊ฒ ์ ์งํ์ธ์. ๋น์ ์ ์ธ์ ๋ ๊ตฌ์กฐ ๋ถํด๊ฐ ๋ง๋๋ ๊ณผ์ ๋ฅผ ๋น์ ์์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
์ ๊ฐ ์ฐ์ฐ์๋ ๊ตฌ์กฐ ๋ถํด์ ๋ฐ๋์ ๋๋ค. ์ด๋ ๋ฐฐ์ด์ ๋ค๋ฅธ ๋ฐฐ์ด ์์, ํน์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ๊ฐ์ฒด ์์ ์ ๊ฐํ๋๋ก ํด์ค๋๋ค. ์๋ฅผ ๋ณด๊ฒ ์ต๋๋ค:
let first = [1, 2];
let second = [3, 4];
let bothPlus = [0, ...first, ...second, 5];
์ด๋ bothPlus์ [0, 1, 2, 3, 4, 5]
๋ผ๋ ๊ฐ์ ์ค๋๋ค.
์ ๊ฐ๋ first
์ second
์ ์์ ๋ณต์ฌ๋ฅผ ๋ง๋ญ๋๋ค.
์ด๋ค์ ์ ๊ฐ์ ์ํด ๋ณํ์ง ์์ต๋๋ค.
๋ํ ๊ฐ์ฒด๋ฅผ ์ ๊ฐํ ์ ์์ต๋๋ค:
let defaults = { food: "spicy", price: "$$", ambiance: "noisy" };
let search = { ...defaults, food: "rich" };
์ฌ๊ธฐ์ search
๋ { food: "rich", price: "$$", ambiance: "noisy" }
์
๋๋ค.
๊ฐ์ฒด ์ ๊ฐ๋ ๋ฐฐ์ด ์ ๊ฐ๋ณด๋ค ํจ์ฌ ๋ณต์กํฉ๋๋ค.
๋ฐฐ์ด ์ ๊ฐ์ฒ๋ผ ์ผ์ชฝ์์-์ค๋ฅธ์ชฝ์ผ๋ก ์งํ๋์ง๋ง ๊ทธ ๊ฒฐ๊ณผ๋ ์ฌ์ ํ ๊ฐ์ฒด์
๋๋ค.
์ด๋ ์ ๊ฐ ๊ฐ์ฒด ์์์ ๋์ค์ ์ค๋ ํ๋กํผํฐ๊ฐ ์ด์ ์ ์ค๋ ํ๋กํผํฐ๋ฅผ ๋ฎ์ด์ฐ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋์ ๋ง์ฝ์ ์ฐ๋ฆฌ๊ฐ ์ด์ ์์ ๋ฅผ ๋ง์ง๋ง์ ์ ๊ฐํ๋๋ก ์์ ํ๋ฉด:
let defaults = { food: "spicy", price: "$$", ambiance: "noisy" };
let search = { food: "rich", ...defaults };
defaults
์์ food
ํ๋กํผํฐ๋ food: "rich"
๋ฅผ ๋ฎ์ด์ฐ๋๋ฐ, ์ด ๊ฒฝ์ฐ ์ฐ๋ฆฌ๊ฐ ์๋ํ ๊ฒ์ ์๋๋๋ค.
๊ฐ์ฒด ์ ๊ฐ๋ ๋ํ ๋ช๋ช์ ๋๋ผ์ด ์ ํ์ ์ด ์์ต๋๋ค. ์ฒซ์งธ๋ก, ์ด๋ ์ค์ง ๊ฐ์ฒด ๋ณธ์ธ์ ์ด๊ฑฐ ๊ฐ๋ฅํ ํ๋กํผํฐ๋ง ํด๋นํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก, ์ด๋ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์ ๊ฐํ๋ฉด ๋ฉ์๋๋ฅผ ์๊ฒ ๋๋ค๋ ๊ฒ์ ๋ปํฉ๋๋ค:
class C {
p = 12;
m() {
}
}
let c = new C();
let clone = { ...c };
clone.p; // ์ฑ๊ณต
clone.m(); // ์ค๋ฅ!
๋ ๋ฒ์งธ๋ก, TypeScript ์ปดํ์ผ๋ฌ๋ ์ ๋ค๋ฆญ ํจ์์์ ํ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ฐํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ดํ ๋ฒ์ ์์ ์์๋๋ ๊ธฐ๋ฅ์ ๋๋ค.