[JavaScript] var์˜ ๋ฌธ์ œ์  (var, let, const)
728x90

๋“ค์–ด๊ฐ€๋ฉฐ

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

๋‚ด ๋จธ๋ฆฟ์†์„ ์ •๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ช‡๊ฐ€์ง€ ๊ฐœ๋…๊ณผ ํ•จ๊ป˜ ์ด๋ฅผ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

 

๊ทธ๋ž˜์„œ var ํ‚ค์›Œ๋“œ๋Š” ๋ญ๊ฐ€ ๋ฌธ์ œ์ผ๊นŒ?

๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ์ด ๊ฐ€๋Šฅ

๋จผ์ € let๊ณผ const ํ‚ค์›Œ๋“œ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณต ์„ ์–ธํ•  ๊ฒฝ์šฐ์—๋Š” ์ด๋ฏธ ์„ ์–ธ๋˜์—ˆ๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋œจ์ง€๋งŒ,
var ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ค‘๋ณตํ•ด์„œ ์„ ์–ธ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

var hello = 'hi';
var js = 'javaScript';

var hello = 1;
var js;

console.log(hello); // 1
console.log(js); // javaScript

let hi = 123;
let hi = 456; // Uncaught SyntaxError: Identifier 'hi' has already been declared

const num = 123;
const num = 'number'; // Uncaught SyntaxError: Identifier 'num' has already been declared

๊ทธ๋Ÿฌ๋‚˜ var ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๋ณ€์ˆ˜ hello๋Š” ๋จผ์ € hi๋ฅผ ํ• ๋‹น๋ฐ›์•˜์Œ์—๋„ ๋‹ค์‹œ ์„ ์–ธ๋œ ์ค‘๋ณต ๋ณ€์ˆ˜๋กœ ๋ฎ์–ด์”Œ์›Œ์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ด๋Ÿฐ ๊ฒฝ์šฐ ์˜๋„์น˜ ์•Š๊ฒŒ ๊ฐ’์ด ๋ฐ”๋€” ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ ธ๋ฒ„๋ฆฌ๊ณ  ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰ ๋‹ค์–‘ํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

์ „์—ญ ๋ณ€์ˆ˜์˜ ๋‚จ๋ฐœ

let, const ํ‚ค์›Œ๋“œ๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„, var ํ‚ค์›Œ๋“œ๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์ด๋‹ค.
์Šค์ฝ”ํ”„๋ฅผ ๊ฐ„๋žตํ•˜๊ฒŒ ์–˜๊ธฐํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์Šค์ฝ”ํ”„

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ์Šค์ฝ”ํ”„๋Š” ์œ ํšจ๋ฒ”์œ„. ์ฆ‰, ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ๋“ฑ ์‹๋ณ„์ž๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ๋งํ•œ๋‹ค.
  • ์ด ์‹๋ณ„์ž๋“ค์€ ์ž์‹ ์ด ์„ ์–ธ๋œ ์œ„์น˜์— ๋”ฐ๋ผ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค.

์ง€์—ญ ์Šค์ฝ”ํ”„

  • ํ•ด๋‹น ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€๊ฐ€ ์œ ํšจ๋ฒ”์œ„์ธ ์Šค์ฝ”ํ”„.

ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

  • ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์™€ ๋ฐ˜๋Œ€๋œ๋‹ค. ํ•จ์ˆ˜ ๋ชธ์ฒด๋งŒ์„ ์ง€์—ญ ์Šค์ฝ”ํ”„๋กœ ์ธ์ •ํ•˜๋Š” ์Šค์ฝ”ํ”„.

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

  • ์ค‘๊ด„ํ˜ธ๋กœ ๊ฒฝ๊ณ„๊ฐ€ ๋ฌถ์ด๋Š” ๋ชจ๋“  ์ฝ”๋“œ ๋ธ”๋ก. (if,for,while,switch,try/catch...๋“ฑ๋“ฑ)

 

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์ธ let๊ณผ const ํ‚ค์›Œ๋“œ

let a = 'a';

function print(){
    const b = 'banana';
    let a = 'apple';

    if(true){
        const a = 'abc';
        console.log(a);
    }

    console.log(a);
}

print();
console.log(a);
console.log(b);

let, const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ์œ ํšจํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์—์„œ๋Š” ์ง€์—ญ์„ ๋ฒ—์–ด๋‚˜๋ฉด ์ง€์—ญ๋ณ€์ˆ˜๊ฐ€ ์ž๋™์œผ๋กœ ์†Œ๋ฉธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

 

 

ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์ธ var ํ‚ค์›Œ๋“œ

function print(){
    var coke = 'zero';
    console.log(coke);
}

if(true){
    var juice = 'orange';
}

print();
console.log(coke); // Uncaught ReferenceError: coke is not defined
console.log(juice); // orange

var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋  ๋•Œ๋งŒ ์œ ํšจํ•˜๊ณ ,
๊ทธ ์™ธ์˜ if๋ฌธ, for๋ฌธ ๋“ฑ์˜ ๊ฒฝ์šฐ๋Š” ์–ด๋””์„œ๋‚˜ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.
์ „์—ญ ๋ณ€์ˆ˜๋Š” ๋ชจ๋“  ์Šค์ฝ”ํ”„์—์„œ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ณ ,
๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๊ฒ€์ƒ‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์†๋„์™€ ์„ฑ๋Šฅ๋ฉด์—์„œ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

 

 

 

๋ณ€์ˆ˜์˜ ํ˜ธ์ด์ŠคํŒ…

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

console.log(hello); // undefined

hello = 'hi'; // ํ• ๋‹น
var hello;  // ์„ ์–ธ

console.log(hello); // hi

์ฒซ๋ฒˆ์งธ ์ถœ๋ ฅ์—์„œ ๋ณ€์ˆ˜ hello๋Š” ์•„์ง ๊ฐ’์„ ํ• ๋‹น๋ฐ›์ง€ ์•Š์•˜์Œ์—๋„ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
์ด undefined์€ var์—์„œ๋Š” ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ํ•œ๋ฒˆ์— ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์˜ค๋Š” ๊ฐ’์ด๋‹ค.

 

 

๋ฐ˜๋ฉด์— let, const ํ‚ค์›Œ๋“œ๋Š” ๋ณ€์ˆ˜์˜ ์„ ์–ธ ๋‹จ๊ณ„์™€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ๋‚˜๋‰˜์–ด์„œ ์ง„ํ–‰๋œ๋‹ค.
์„ ์–ธ์€ var ํ‚ค์›Œ๋“œ์ฒ˜๋Ÿผ ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์‹คํ–‰๋˜์ง€๋งŒ ์ดˆ๊ธฐํ™”๋Š” ๋ณ€์ˆ˜ ์„ ์–ธ๋ฌธ์—์„œ, ํ• ๋‹น์€ ํ• ๋‹น๋ฌธ์—์„œ ์‹คํ–‰๋œ๋‹ค.

console.log(kiwi); // Uncaught ReferenceError: kiwi is not defined

let kiwi = 'kiwi'; // ์„ ์–ธ๊ณผ ํ• ๋‹น
console.log(kiwi); // kiwi

์ฒซ๋ฒˆ์งธ ์ถœ๋ ฅ์—์„œ ๋ณ€์ˆ˜๊ฐ€ ์•„์ง ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์œ„์—์„œ ์‹œ์ž‘๋ถ€ํ„ฐ ๋ณ€์ˆ˜ kiwi๊ฐ€ ์„ ์–ธ๋˜๊ธฐ ์ „๊นŒ์ง€, ์ฐธ์กฐ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ด ๊ตฌ๊ฐ„์„ TDZ(Temporal Dead Zone). ์ผ์‹œ์  ์‚ฌ๊ฐ์ง€๋Œ€๋ผ๊ณ  ํ•œ๋‹ค.
์ด ๊ตฌ๊ฐ„์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ทธ๋ ‡๋‹ค๋ฉด let๊ณผ const ํ‚ค์›Œ๋“œ์—์„œ๋Š” ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฑธ๊นŒ?
๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ๋ฟ์ด๋‹ค.

let a = 'apple'; // ์ „์—ญ ๋ณ€์ˆ˜

function print(){
    console.log(a); // Uncaught ReferenceError: Cannot access 'a' before initialization
    let a = 'at'; // ์ง€์—ญ ๋ณ€์ˆ˜
}

์œ„์˜ ์ฝ”๋“œ์—์„œ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ „์—ญ ๋ณ€์ˆ˜ a์˜ ๊ฐ’์ธ apple์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.
ํ•˜์ง€๋งŒ ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

ํ˜ธ์ด์ŠคํŒ…์€ ์Šค์ฝ”ํ”„์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋„ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

์ง€์—ญ ๋ณ€์ˆ˜ a๊ฐ€ ์•„์ง ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์•„ ์ฐธ์กฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค.

 

 

์ •๋ฆฌํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

var

  • ๋ณ€์ˆ˜์˜ ์ค‘๋ณต ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜ ์™ธ์—๋Š” ๋ชจ๋‘ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค.
  • ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•ด์„œ ์„ ์–ธ ์ด์ „์˜ ๋ณ€์ˆ˜๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

let๊ณผ const

  • ๋ณ€์ˆ˜์˜ ์ค‘๋ณต ์„ ์–ธ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.
  • ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ผ ์ง€์—ญ ์Šค์ฝ”ํ”„ ์ด์™ธ์˜ ๋ณ€์ˆ˜๋Š” ์ฐธ์กฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ TDZ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.
  • const๋Š” ์žฌํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋ฅผ ์œ„ํ•œ ํ‚ค์›Œ๋“œ๋‹ค.
728x90