Skip to content

Latest commit

ย 

History

History
696 lines (522 loc) ยท 22.4 KB

variable-declarations.md

File metadata and controls

696 lines (522 loc) ยท 22.4 KB

๋ณ€์ˆ˜ ์„ ์–ธ (Variable Declarations)

let๊ณผ const๋Š” JavaScript์—์„œ ๋น„๊ต์  ์ƒˆ๋กœ์šด ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ณ€์ˆ˜ ์„ ์–ธ์ž…๋‹ˆ๋‹ค. ์•ž์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, let์€ var์™€ ์–ด๋Š ์ •๋„ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ JavaScript์—์„œ ์ž์ฃผ ๋งˆ์ฃผ์น˜๋Š” ๊ฒฐํ•จ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. const๋Š” let์˜ ๊ธฐ๋Šฅ์ด ๊ฐ•ํ™”๋œ ๊ฒƒ์œผ๋กœ ๋ณ€์ˆ˜์— ์žฌํ• ๋‹น์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

TypeScript๋Š” JavaScript์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ด๋ฏ€๋กœ, ๋‹น์—ฐํžˆ let๊ณผ const๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ƒˆ๋กœ์šด ์„ ์–ธ ๋ฐฉ์‹๋“ค๊ณผ ์™œ ๊ทธ ๋ฐฉ์‹๋“ค์ด var๋ณด๋‹ค ์„ ํ˜ธ๋˜๋Š”์ง€๋ฅผ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

JavaScript๋ฅผ ์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด, ๋‹ค์Œ ์„น์…˜์ด ๊ธฐ์–ต์„ ์ƒˆ๋กœ ๊ณ ์น˜๋„๋ก ๋„์™€์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. JavaScript์—์„œ var ์„ ์–ธ์˜ ๋‹จ์ ๋“ค์— ๋Œ€ํ•ด ๋ชจ๋‘ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

var ์„ ์–ธ (var declarations)

๊ธฐ์กด 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' ๋ฐ˜ํ™˜

์Šค์ฝ”ํ”„ ๊ทœ์น™ (Scoping rules)

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๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค ๊ฒฝํ—˜ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋Š” ๋ฐ”๋กœ ์•Œ์•„์ฐจ๋ฆฌ๊ฒ ์ง€๋งŒ, ๋น„์Šทํ•œ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ๋Š” ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์น˜๋ฉฐ ์ขŒ์ ˆ์˜ ์›์ธ์ด ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ์บก์ณ๋ง์˜ ๋‹จ์  (Variable capturing quirks)

๋‹ค์Œ ์ฝ”๋“œ์˜ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ƒํ•ด ๋ณด์„ธ์š”:

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๋ฅผ ๊ฐ์ถฐ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฆ„์„ ๊ฐ™๊ฒŒ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํ”„์˜ ์‹คํ–‰ ๋ถ€๋ฅผ ํฌ๊ฒŒ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

let ์„ ์–ธ (let declarations)

์ด์ œ, var์— ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์— ๋Œ€ํ•ด ์•Œ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ์ด๋Ÿฐ ์ด์œ  ๋•Œ๋ฌธ์— let์„ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋นผ๊ณ ๋Š” let ๋ฌธ์€ var์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.

let hello = "Hello!";

์ฃผ์š”ํ•œ ์ฐจ์ด์ ์€ ๊ตฌ๋ฌธ ๋ณด๋‹จ ์˜๋ฏธ์— ์žˆ๋Š”๋ฐ, ์ด์ œ ์ด ๋‚ด์šฉ์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ธ”๋ก ์Šค์ฝ”ํ”„ (Block-scoping)

๋ณ€์ˆ˜๊ฐ€ 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๋ฅผ ์‚ดํŽด๋ณด์„ธ์š”.

์žฌ์„ ์–ธ๊ณผ ์‰๋„์ž‰ (Re-declarations and Shadowing)

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์˜ ์ด์ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ํ•ฉํ•œ ์ƒํ™ฉ์ด ์žˆ์œผ๋ฏ€๋กœ, ์ตœ์„ ์˜ ํŒ๋‹จ์„ ๋‚ด๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋ณ€์ˆ˜ ์บก์ณ๋ง (Block-scoped variable capturing)

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 declarations)

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 ์ฑ•ํ„ฐ์— ์ž์„ธํžˆ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

let vs. const

์œ ์‚ฌํ•œ ์Šค์ฝ”ํ”„์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ณ€์ˆ˜ ์„ ์–ธ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋Š ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€๋Š” ์Šค์Šค๋กœ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ด‘๋ฒ”์œ„ํ•œ ์งˆ๋ฌธ์ฒ˜๋Ÿผ, ๋‹ต์€ '๋•Œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค'์ž…๋‹ˆ๋‹ค.

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

์ตœ์„ ์˜ ํŒ๋‹จ์„ ํ•˜๊ณ  ํ•ด๋‹น๋˜๋Š” ๊ฒฝ์šฐ, ํŒ€์›๋“ค๊ณผ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ƒ์˜ํ•˜์„ธ์š”.

์ด ํ•ธ๋“œ๋ถ์€ ๋Œ€๋ถ€๋ถ„ let ์„ ์–ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ ๋ถ„ํ•ด (Destructuring)

TypeScript๊ฐ€ ๊ฐ€์ง„ ๋˜ ๋‹ค๋ฅธ ECMAScript 2015 ํŠน์ง•์€ ๊ตฌ์กฐ ๋ถ„ํ•ด์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€, Mozilla Developer Network์˜ ๊ธ€์„ ์ฐธ๊ณ  ํ•˜์„ธ์š”. ์ด๋ฒˆ ์„น์…˜์—์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐœ์š”๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด (Array destructuring)

๊ตฌ์กฐ ๋ถ„ํ•ด์˜ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ๋Š” ๋ฐฐ์—ด ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์ž…๋‹ˆ๋‹ค:

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 ์ถœ๋ ฅ

ํŠœํ”Œ ๊ตฌ์กฐ ๋ถ„ํ•ด (Tuple destructuring)

ํŠœํ”Œ์€ ๋ฐฐ์—ด์ฒ˜๋Ÿผ ๊ตฌ์กฐ ๋ถ„ํ•ด๋ฉ๋‹ˆ๋‹ค; ๊ตฌ์กฐ ๋ถ„ํ•ด๋œ ๋ณ€์ˆ˜๋Š” ํŠœํ”Œ ์š”์†Œ์™€ ์ผ์น˜ํ•˜๋Š” ํƒ€์ž…์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค:

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

๊ฐ์ฒด ๊ตฌ์กฐ ๋ถ„ํ•ด (Object destructuring)

๋˜ํ•œ ๊ฐ์ฒด๋ฅผ ๊ตฌ์กฐ ๋ถ„ํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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;

ํ”„๋กœํผํ‹ฐ ์ด๋ฆ„ ๋ฐ”๊พธ๊ธฐ (Property renaming)

ํ”„๋กœํผํ‹ฐ๋“ค์— ๋‹ค๋ฅธ ์ด๋ฆ„์„ ๋ถ™ํžˆ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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;

๊ธฐ๋ณธ ๊ฐ’ (Default values)

๊ธฐ๋ณธ ๊ฐ’์€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

function keepWholeObject(wholeObject: { a: string, b?: number }) {
    let { a, b = 1001 } = wholeObject;
}

์˜ˆ์ œ์—์„œ b?๋Š” b๊ฐ€ ์„ ํƒ์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Š” undefined ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. keepWholeObject๋Š” ์ด์ œ b๊ฐ€ undefined ์ด๋”๋ผ๋„ a, b ํ”„๋กœํผํ‹ฐ์™€ ํ•จ๊ป˜ wholeObject๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

ํ•จ์ˆ˜ ์„ ์–ธ (Function declarations)

๊ตฌ์กฐ ๋ถ„ํ•ด๋Š” ํ•จ์ˆ˜ ์„ ์–ธ์—์„œ๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ๊ฒฝ์šฐ์—๋Š” ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค:

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`๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌ์กฐ ๋ถ„ํ•ด๋ฅผ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์„ธ์š”. ์•ž์— ์˜ˆ์ œ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด, ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ‘œํ˜„์‹ ์ด์™ธ์˜ ๊ฒƒ๋“ค์€ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด ์ด๋ฆ„ ๋ณ€๊ฒฝ, ๊ธฐ๋ณธ๊ฐ’, ํƒ€์ž… ํ‘œ์‹œ๊ฐ€ ์—†๋”๋ผ๋„ ๊นŠ๊ฒŒ ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ ๋ถ„ํ•ด๋Š” ์ •๋ง ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ํž˜๋“ญ๋‹ˆ๋‹ค. ๊ตฌ์กฐ ๋ถ„ํ•ด ํ‘œํ˜„์‹์„ ์ž‘๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”. ๋‹น์‹ ์€ ์–ธ์ œ๋‚˜ ๊ตฌ์กฐ ๋ถ„ํ•ด๊ฐ€ ๋งŒ๋“œ๋Š” ๊ณผ์ œ๋ฅผ ๋‹น์‹  ์†์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ „๊ฐœ (Spread)

์ „๊ฐœ ์—ฐ์‚ฐ์ž๋Š” ๊ตฌ์กฐ ๋ถ„ํ•ด์™€ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฐ์—ด์„ ๋‹ค๋ฅธ ๋ฐฐ์—ด ์•ˆ์—, ํ˜น์€ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด ์•ˆ์— ์ „๊ฐœํ•˜๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

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 ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜์—์„œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๊ฐœํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ดํ›„ ๋ฒ„์ „์—์„œ ์˜ˆ์ƒ๋˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.