๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ๋ฐœ/Javascript

javascript ๋ณ€์ˆ˜ / ํ˜ธ์ด์ŠคํŒ… / var, let, const ์ฐจ์ด

by 1mj 2022. 1. 26.

๋ชฉ์ฐจ

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜

๋ณ€์ˆ˜(variable)๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋ณ€ํ•˜๋Š” ์ˆ˜, ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ™•๋ณดํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๋˜๋Š” ๊ทธ ์ฃผ์†Œ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ™์ธ ์ด๋ฆ„์ด๋‹ค.

 

const myVar = 'hello';
// ๋ณ€์ˆ˜๋ช…: myVar
// ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(์œ„์น˜): 0x00000010
// ๋ณ€์ˆ˜ ๊ฐ’: hello

 

โœ ๋ณ€์ˆ˜์˜ ์„ ์–ธ(declaration)

๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„(์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๋Š” ๋„๊ตฌ)์— ์ด๋ฆ„์ด '๋ณ€์ˆ˜๋ช…'์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋งˆ๋ จํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ๋™์‹œ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

 

var ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ๋”ฐ๋กœ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด undefined๋ฅผ ํ• ๋‹นํ•ด ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

๋ฐ˜๋ฉด let, const ๋ณ€์ˆ˜๋Š” ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์ฐธ์กฐํ•  ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

var myVar;
console.log(myVar);	// undefined

const yourVal;
console.log(yourVal);	// Uncaught SyntaxError: Missing initializer in const declaration

 

โœ ๋ณ€์ˆ˜์˜ ํ• ๋‹น(assignment)

ํ• ๋‹น ์—ฐ์‚ฐ์ž(=)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ํ• ๋‹นํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์žฌํ• ๋‹นํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

์„ ์–ธ์€ ๋Ÿฐํƒ€์ž„ ์ด์ „์— ์‹คํ–‰๋˜๊ณ  ํ• ๋‹น์€ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ์œผ๋ฉฐ ๋Ÿฐํƒ€์ž„์— ์‹คํ–‰๋œ๋‹ค. (์„ ์–ธ๊ณผ ํ• ๋‹น์„ ํ•˜๋‚˜์˜ ๊ตฌ๋ฌธ์œผ๋กœ ํ‘œํ˜„ํ•˜๋”๋ผ๋„)

 

โœ ๋ณ€์ˆ˜์˜ ์ฐธ์กฐ(reference)

๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์ฝ๋Š” ๊ฒƒ์„ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

 

ํ˜ธ์ด์ŠคํŒ…(hoisting)

var ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜ ์„ ์–ธ์ด ํ•ด๋‹น ์Šค์ฝ”ํ”„ ๋‚ด ์ตœ์ƒ๋‹จ์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€ ํ˜„์ƒ์„ ํ˜ธ์ด์ŠคํŒ…์ด๋ผ๊ณ  ํ•œ๋‹ค.

// ๋ณ€์ˆ˜ ์„ ์–ธ ์ „
console.log(myVar);	// undefined

// ๋ณ€์ˆ˜ ์„ ์–ธ ํ›„
var myVar;
console.log(myVar);	// undefined

 

์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์—๋„ undefined๋กœ ํ• ๋‹น๋˜์–ด ์žˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „ Parser ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋“  ์„ ์–ธ์„ ๋ชจ์•„ ์ตœ์ƒ๋‹จ์— ์ €์žฅํ•˜๊ณ  ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์‹คํ–‰์‹œํ‚จ๋‹ค. ๋”ฐ๋ผ์„œ ์ฝ”๋“œ ์‹คํ–‰ ์ „ ์ด๋ฏธ ์„ ์–ธ๋“ค์„ ๋ชจ๋‘ ์ €์žฅํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธ ์ „ ์ฐธ์กฐ๋ฅผ ํ•˜๋”๋ผ๋„ ์˜ค๋ฅ˜ ์—†์ด ๋™์ž‘ํ•œ๋‹ค.

 

func1();	// hello
func2();	// Uncaught TypeError: func2 is not a function

// ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ
function func1() { 
	console.log("hello");
}

// ํ•จ์ˆ˜ ํ‘œํ˜„์‹
var func2 = function() {
	console.log("bye");
}

func2();	// ์ฝ”๋“œ ์‹คํ–‰ ์ˆœ์„œ ์ƒ ์ดˆ๊ธฐํ™” ํ›„์— ์œ„์น˜ํ•˜๋ฏ€๋กœ bye ์ถœ๋ ฅ

 

๊ฐ™์€ ๋งฅ๋ฝ์—์„œ ํ•จ์ˆ˜ ์„ ์–ธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์„ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

func1์€ JS Parser ๋‚ด๋ถ€ ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•ด ์„ ์–ธ ์ „์— ํ˜ธ์ถœํ•˜๋”๋ผ๋„ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

func2๋Š” ์ต๋ช…ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ์ดˆ๊ธฐํ™”ํ•˜๋Š” ์ฝ”๋“œ ์ด์ „์— ํ˜ธ์ถœํ•  ๊ฒฝ์šฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์œ„ํ•ด ๋˜๋„๋ก ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๊ธ‰์  ์ฝ”๋“œ ์ƒ๋‹จ๋ถ€์— ์„ ์–ธํ•˜๊ณ  var ๋ณ€์ˆ˜ ๋Œ€์‹  const๋‚˜ let ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

var, let, const ์ฐจ์ด

const์™€ let์€ ES6์—์„œ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

  var let const
์ค‘๋ณต ์„ ์–ธ ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€๋Šฅ
์žฌํ• ๋‹น ๊ฐ€๋Šฅ ๊ฐ€๋Šฅ ๋ถˆ๊ฐ€๋Šฅ
์Šค์ฝ”ํ”„ ์œ ํšจ๋ฒ”์œ„ ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„
ํ˜ธ์ด์ŠคํŒ… ๋ฐœ์ƒ
(์„ ์–ธํ•˜๊ณ  undefined๋กœ ์ดˆ๊ธฐํ™”)
๋ฐœ์ƒ
(์„ ์–ธ๋งŒ ํ•˜๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ”๋“œ ์‹คํ–‰ ๊ณผ์ •์—์„œ ์ดˆ๊ธฐํ™”)
๋ฐœ์ƒ
(์„ ์–ธ๋งŒ ํ•˜๊ณ  ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ”๋“œ ์‹คํ–‰ ๊ณผ์ •์—์„œ ์ดˆ๊ธฐํ™”)
์ „์—ญ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์—ฌ๋ถ€ O X X

๊ฐ’์„ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” let, ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” const๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

 

โœ var ๋ณ€์ˆ˜

// 1. ์ค‘๋ณต์„ ์–ธ
var test1 = 1;
console.log(test1);	// 1
var test1 = 2;	// ๋งˆ์ง€๋ง‰์— ํ• ๋‹น๋œ ๊ฐ’ 
console.log(test1);	// 2
var test1;	// ์„ ์–ธ๋งŒ ํ•œ ๊ฒฝ์šฐ ์„ ์–ธ๋ฌธ ์ž์ฒด๊ฐ€ ๋ฌด์‹œ๋จ
console.log(test1);	// 2


// 2. ์žฌํ• ๋‹น
var test2 = 1;
test2 = 100;	// ๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ(์žฌํ• ๋‹น)
console.log(test2);	// 100


// 3. ์Šค์ฝ”ํ”„ ์œ ํšจ๋ฒ”
// ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์ฐธ์กฐ ๋ถˆ๊ฐ€
function test3() {
	var x1 = 100;
  console.log(x1);
}
test3();	// 100
// console.log(x1);	// Uncaught ReferenceError: x1 is not defined

// ๋ธ”๋ก ๋ฐ–์—์„œ ์ฐธ์กฐ ๊ฐ€๋Šฅ
if (true) {
	var x2 = 200;
}
console.log(x2);	// 200


// 4. ํ˜ธ์ด์ŠคํŒ…
for (var i=0; i < 10; i++) {
  // console.log('i: ' + i)
}
console.log('after i: ' + i) // after i: 10


// 5. ์ „์—ญ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์—ฌ๋ถ€(๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ)
var test5 = 5;
console.log(window.test5);	// 5

 

โœ let ๋ณ€์ˆ˜

// 1. ์ค‘๋ณต์„ ์–ธ
let test1 = 1;
// let test1 = 2;	// Uncaught SyntaxError: Identifier 'test1' has already been declared

// 2. ์žฌํ• ๋‹น
let test2 = 1;
test2 = 100;	// ๊ฐ’ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ(์žฌํ• ๋‹น)
console.log(test2);	// 100


// 3. ์Šค์ฝ”ํ”„ ์œ ํšจ๋ฒ”
// ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์ฐธ์กฐ ๋ถˆ๊ฐ€
function test3() {
	let x1 = 100;
  console.log(x1);
}
test3();	// 100
// console.log(x1);	// Uncaught ReferenceError: x1 is not defined

// ๋ธ”๋ก ๋ฐ–์—์„œ ์ฐธ์กฐ ๋ถˆ๊ฐ€
if (true) {
	let x2 = 200;
}
// console.log(x2);	// Uncaught ReferenceError: x2 is not defined


// 4. ํ˜ธ์ด์ŠคํŒ…
for (let i=0; i < 10; i++) {
  console.log('i: ' + i)
}
// console.log('after i: ' + i) // Uncaught ReferenceError: i is not defined


// 5. ์ „์—ญ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์—ฌ๋ถ€(๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ)
let test5 = 5;	// ์ „์—ญ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹˜
console.log(window.test5);	// undefined

 

โœ const ๋ณ€์ˆ˜

// 1. ์ค‘๋ณต์„ ์–ธ
const test1 = 1;
// const test1 = 2;	// Uncaught SyntaxError: Identifier 'test1' has already been declared

// 2. ์žฌํ• ๋‹น
const test2 = 1;
// test2 = 100;	// Uncaught TypeError: Assignment to constant variable.
console.log(test2);	// 1


// 3. ์Šค์ฝ”ํ”„ ์œ ํšจ๋ฒ”
// ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์ฐธ์กฐ ๋ถˆ๊ฐ€
function test3() {
	const x1 = 100;
  console.log(x1);
}
test3();	// 100
// console.log(x1);	// Uncaught ReferenceError: x1 is not defined

// ๋ธ”๋ก ๋ฐ–์—์„œ ์ฐธ์กฐ ๋ถˆ๊ฐ€
if (true) {
	const x2 = 200;
}
// console.log(x2);	// Uncaught ReferenceError: x2 is not defined


// 4. ํ˜ธ์ด์ŠคํŒ…
// ํ˜ธ์ด์ŠคํŒ…์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ์€ ๋˜์—ˆ๊ณ  ์ดˆ๊ธฐํ™”๊ฐ€ ์•ˆ๋˜์–ด์žˆ์Œ
// console.log(test4); // Cannot access 'test4' before initialization
const test4 = 10;


// 5. ์ „์—ญ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ ์—ฌ๋ถ€(๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ)
const test5 = 5;	// ์ „์—ญ๊ฐ์ฒด ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹˜
console.log(window.test5);	// undefined

 

์ฐธ๊ณ ์ž๋ฃŒ ๋ฐ ์ถœ์ฒ˜ ๐Ÿ™‡‍โ™‚๏ธ

https://www.howdy-mj.me/javascript/var-let-const/

https://gmlwjd9405.github.io/2019/04/22/javascript-hoisting.html

https://curryyou.tistory.com/192

 

๋Œ“๊ธ€