λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Language/Javascript

[Javascript]μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜ μ΄ν•΄ν•˜κΈ°: var, let, const 차이점

by YJ Dev 2024. 6. 11.
728x90
λ°˜μ‘ν˜•
SMALL

μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜λŠ” ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 μš”μ†Œλ‘œ, 데이터λ₯Ό μ €μž₯ν•˜κ³  μ‘°μž‘ν•˜λŠ” 데 ν•„μˆ˜μ μΈ 역할을 ν•©λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜κ³  μ‚¬μš©ν•˜λŠ” 방법을 μžμ„Ένžˆ μ„€λͺ…ν•˜κ³ , var, let, const의 차이점을 λͺ…ν™•ν•˜κ²Œ 뢄석해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜


01. μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜λž€?πŸ”

λ¨Όμ €, λ³€μˆ˜λž€ λ¬΄μ—‡μΌκΉŒμš”? κ°„λ‹¨νžˆ 말해, λ³€μˆ˜λŠ” 값을 μ €μž₯ν•  수 μžˆλŠ” κ³΅κ°„μž…λ‹ˆλ‹€. λ³€μˆ˜λŠ” 데이터λ₯Ό μ €μž₯ν•˜κ³ , κ·Έ 데이터λ₯Ό ν•„μš”ν•  λ•Œ λ‹€μ‹œ μ‚¬μš©ν•  수 있게 ν•΄ μ€λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ³€μˆ˜λŠ” λ‹€μ–‘ν•œ νƒ€μž…μ˜ 데이터λ₯Ό μ €μž₯ν•  수 있으며, μ΄λŸ¬ν•œ μœ μ—°μ„± 덕뢄에 λ‹€μ–‘ν•œ μƒν™©μ—μ„œ ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


02. λ³€μˆ˜ μ„ μ–Έ λ°©λ²•βœοΈ

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λŠ” 방법은 μ„Έ 가지가 μžˆμŠ΅λ‹ˆλ‹€: var, let, const. 각각의 ν‚€μ›Œλ“œλŠ” λ³€μˆ˜μ˜ μ„ μ–Έκ³Ό μ‚¬μš©μ— μžˆμ–΄μ„œ κ³ μœ ν•œ νŠΉμ„±μ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.

  • var: κ°€μž₯ 였래된 λ³€μˆ˜ μ„ μ–Έ λ°©λ²•μž…λ‹ˆλ‹€.
var x = 10;
console.log(x); // 10
  • let: ES6(ECMAScript 2015)μ—μ„œ λ„μž…λœ λ³€μˆ˜ μ„ μ–Έ λ°©λ²•μž…λ‹ˆλ‹€.
let y = 20;
console.log(y); // 20
  • const: μ—­μ‹œ ES6μ—μ„œ λ„μž…λ˜μ—ˆμœΌλ©°, μƒμˆ˜(constant)λ₯Ό μ„ μ–Έν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
const z = 30;
console.log(z); // 30

03. var, let, const μ°¨μ΄μ βš–οΈ

이제 var, let, const의 차이점을 μ’€ 더 μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

var

varλŠ” κ°€μž₯ 였래된 λ³€μˆ˜ μ„ μ–Έ λ°©λ²•μœΌλ‘œ, ES6 이전뢀터 μ‚¬μš©λ˜μ—ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λͺ‡ 가지 νŠΉμ„± λ•Œλ¬Έμ— ν˜„λŒ€ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ” 잘 μ‚¬μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

νŠΉμ„±

  • ν•¨μˆ˜ μŠ€μ½”ν”„(Function Scope): var둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” ν•¨μˆ˜ λ‚΄μ—μ„œ μœ νš¨ν•©λ‹ˆλ‹€. ν•¨μˆ˜ λ°–μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • ν˜Έμ΄μŠ€νŒ…(Hoisting): var둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” μ„ μ–Έ μœ„μΉ˜μ— 상관없이 ν•¨μˆ˜ λ˜λŠ” μ „μ—­ μŠ€μ½”ν”„μ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ €μ§‘λ‹ˆλ‹€. 단, μ΄ˆκΈ°ν™”λŠ” ν˜Έμ΄μŠ€νŒ…λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

예제

console.log(a); // undefined
var a = 10;
console.log(a); // 10

function testVar() {
    var x = 1;
    if (true) {
        var x = 2; // λ™μΌν•œ λ³€μˆ˜
        console.log(x); // 2
    }
    console.log(x); // 2
}
testVar();

let

let은 ES6μ—μ„œ λ„μž…λœ λ³€μˆ˜ μ„ μ–Έ λ°©λ²•μœΌλ‘œ, var의 λͺ‡ 가지 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.

νŠΉμ„±

  • 블둝 μŠ€μ½”ν”„(Block Scope): let으둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” 블둝({}) λ‚΄λΆ€μ—μ„œλ§Œ μœ νš¨ν•©λ‹ˆλ‹€. 블둝 λ°”κΉ₯μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • μž¬ν• λ‹Ή κ°€λŠ₯: let으둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” λ‚˜μ€‘μ— λ‹€λ₯Έ κ°’μœΌλ‘œ μž¬ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • ν˜Έμ΄μŠ€νŒ…(Hoisting): let도 ν˜Έμ΄μŠ€νŒ…λ˜μ§€λ§Œ, μ„ μ–Έ 전에 μ ‘κ·Όν•˜λ©΄ ReferenceErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€. μ΄λŠ” "Temporal Dead Zone(TDZ)" 즉, μΌμ‹œμ  μ‚¬κ°μ§€λŒ€ λ•Œλ¬Έμž…λ‹ˆλ‹€.

예제

console.log(b); // ReferenceError
let b = 20;
console.log(b); // 20

function testLet() {
    let y = 1;
    if (true) {
        let y = 2; // λ‹€λ₯Έ λ³€μˆ˜
        console.log(y); // 2
    }
    console.log(y); // 1
}
testLet();

const

const도 ES6μ—μ„œ λ„μž…λ˜μ—ˆμœΌλ©°, μƒμˆ˜(constant) 선언에 μ‚¬μš©λ©λ‹ˆλ‹€. ν•œ 번 값이 ν• λ‹Ήλ˜λ©΄ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

νŠΉμ„±

  • 블둝 μŠ€μ½”ν”„(Block Scope): const둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” 블둝({}) λ‚΄λΆ€μ—μ„œλ§Œ μœ νš¨ν•©λ‹ˆλ‹€.
  • μž¬ν• λ‹Ή λΆˆκ°€: const둜 μ„ μ–Έλœ λ³€μˆ˜λŠ” λ‚˜μ€‘μ— λ‹€λ₯Έ κ°’μœΌλ‘œ μž¬ν• λ‹Ήν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • ν˜Έμ΄μŠ€νŒ…(Hoisting): const도 ν˜Έμ΄μŠ€νŒ… λ˜μ§€λ§Œ, μ„ μ–Έ 전에 μ ‘κ·Όν•˜λ©΄ ReferenceErrorκ°€ λ°œμƒν•©λ‹ˆλ‹€. μ΄λŠ” "Temporal Dead Zone(TDZ)" 즉, μΌμ‹œμ  μ‚¬κ°μ§€λŒ€ λ•Œλ¬Έμž…λ‹ˆλ‹€.

예제

console.log(c); // ReferenceError
const c = 30;
console.log(c); // 30

function testConst() {
    const z = 1;
    if (true) {
        const z = 2; // λ‹€λ₯Έ λ³€μˆ˜
        console.log(z); // 2
    }
    console.log(z); // 1
}
testConst();

// μž¬ν• λ‹Ή λΆˆκ°€ 예제
const d = 40;
d = 50; // TypeError

πŸ™Œμ—¬κΈ°μ„œ 잠깐!

Temporal Dead Zone(TDZ)μ΄λž€?

letκ³Ό const ν‚€μ›Œλ“œκ°€ ES6(ECMAScript 2015)μ—μ„œ λ„μž…λ˜λ©΄μ„œ 생긴 κ°œλ…μž…λ‹ˆλ‹€.
TDZλŠ” letκ³Ό const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜κ°€ μ΄ˆκΈ°ν™”λ˜κΈ° μ „κΉŒμ§€ μ ‘κ·Όν•  수 μ—†λŠ” ꡬ간을 μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œμ˜ μ•ˆμ „μ„±κ³Ό 가독성을 높이며, μ΄ˆκΈ°ν™” 전에 λ³€μˆ˜μ— μ ‘κ·Όν•˜λ €λŠ” μ‹€μˆ˜λ₯Ό λ°©μ§€ν•©λ‹ˆλ‹€. TDZλ₯Ό μ΄ν•΄ν•˜κ³  ν™œμš©ν•˜λ©΄, μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ 보닀 λͺ…ν™•ν•˜κ³  였λ₯˜ μ—†λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

var, let, const 쀑 무엇을 μ‚¬μš©ν•΄μ•Ό ν• κΉŒμš”?

  • κΈ°λ³Έμ μœΌλ‘œλŠ” constλ₯Ό μ‚¬μš©ν•˜κ³ , 값이 변경될 ν•„μš”κ°€ μžˆλŠ” κ²½μš°μ—λ§Œ let을 μ‚¬μš©ν•˜μ„Έμš”. varλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

μ™œ varλ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆ λ κΉŒμš”?

  • varλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„μ™€ ν˜Έμ΄μŠ€νŒ… 문제둜 인해 예기치 μ•Šμ€ 버그λ₯Ό μœ λ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

04. λ³€μˆ˜ μ΄ˆκΈ°ν™”μ™€ ν• λ‹ΉπŸŽ―;

λ³€μˆ˜ μ„ μ–Έκ³Ό λ™μ‹œμ— 값을 μ΄ˆκΈ°ν™”ν•  수 있으며, λ‚˜μ€‘μ— 값을 μž¬ν• λ‹Ήν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ΄ˆκΈ°ν™” 예제

let name = "John";
console.log(name); // John

μž¬ν• λ‹Ή 예제

let age = 25;
age = 26;
console.log(age); // 26

const의 μ˜ˆμ™Έ 처리

const country = "Korea";
country = "USA"; // 였λ₯˜ λ°œμƒ

05. λ³€μˆ˜λͺ… μž‘μ„± κ·œμΉ™πŸ“

λ³€μˆ˜λͺ…을 μž‘μ„±ν•  λ•Œμ—λŠ” λͺ‡ 가지 κ·œμΉ™μ„ λ”°λ₯΄λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ΄λŠ” μ½”λ“œμ˜ 가독성을 높이고 μœ μ§€λ³΄μˆ˜λ₯Ό μš©μ΄ν•˜κ²Œ λ§Œλ“­λ‹ˆλ‹€.

1. 의미 μžˆλŠ” 이름 μ‚¬μš©:

  • λ³€μˆ˜λͺ…은 λ³€μˆ˜μ˜ μ—­ν• μ΄λ‚˜ 의미λ₯Ό 잘 λ‚˜νƒ€λ‚΄μ•Ό ν•©λ‹ˆλ‹€.
let totalPrice = 100;


2. camelCase μ‚¬μš©
:

  • μ—¬λŸ¬ λ‹¨μ–΄λ‘œ 이루어진 λ³€μˆ˜λͺ…은 camelCaseλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
let userFirstName = "John";


3. μ˜ˆμ•½μ–΄ ν”Όν•˜κΈ°
:

  • μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μ˜ˆμ•½μ–΄λŠ” λ³€μˆ˜λͺ…μœΌλ‘œ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
// 잘λͺ»λœ 예
let for = 10; // 였λ₯˜ λ°œμƒ

06. 핡심 λ‚΄μš©πŸ‘€

μžλ°”μŠ€ν¬λ¦½νŠΈ λ³€μˆ˜

728x90
λ°˜μ‘ν˜•