IdoCleanCode
article thumbnail

자바스크립트에서 변수의 선언이란 메모리 공간을 할당하고 그 공간을 식벽할 이름을 부여하는 것을 의미합니다. 자바스크립트에서 변수를 선언하는 방법은 주로 var, let, const 키워드를 사용합니다. 각각의 키워드는 특징이 입니다.

 

변수 선언할 때 기본 구문은 다음과 같습니다.

변수키워드 식별자

여기서 변수 키워드는 var, let, const 중 하나를 사용할 수 있고, 식별자는 변수나 상수의 이름을 의미합니다.

var 변수이름;
let 변수이름;
const 상수이름 = 값;

var

var의 특징

  • 함수 스코프를 가집니다. 함수 내에서 선언된 var 변수는 해당 함수 내에서만 유효합니다. 
    function myFunction() {
      var functionScoped = "접근 가능";
      console.log(functionScoped); // 출력: 접근 가능
    }
    myFunction();
    console.log(functionScoped); // 에러: functionScoped is not defined​
  • 함수 밖에서 선언된 var변수는 전역 변수가 됩니다.
    var globalVar = "전역 변수";
    function testFunction() {
    	console.log(globalVar); // 출력: 전역 변수 
    }
    testFunction();
    console.log(globalVar); // 출력: 전역 변수​
  • 초기화하지 않는 var 변수는 undefined 값을 가집니다.
    var myVar; console.log(myVar); // 출력: undefined​
  • 같은 이름의 var 변수를 같은 스코프 내에서 여러 번 선언할 수 있습니다.(중복 선언)
    var myVar = 1;
    var myVar = 2;
    console.log(myvar);​
  • 호이스팅이 발생합니다. 변수 선언이 스코프의 최상단으로 끌어 올려집니다.
    console.log(hoistedVar); //출력: undefined
    var hoistedVar = "호이스팅!";
    console.log(hoistedVar); //출력: 호이스팅!​

var의 단점과 대안

  • var의 함수 스코프와 호이스팅은 문제를 야기 할 수 있습니다. ES6에서 문제를 해결하기 위해 let과 const라는 새로운 변수 선언 키워드를 도입 했습니다.
  • let과 const는 블록 스코프를 가지며, 호이스팅이 발생하지만, 초기화 전에 접근할 수 없는 '일시적 사각지대(Temporal Dead Zone)'를 가집니다.

let

let 특징

  • 블록 스코프를 가집니다. { }로 둘러싸인 블록 내에서만 유효합니다.
    if (true) {
      let blockScoped = "접근 가능";
      console.log(blockScoped); // 출력: 접근 가능
    }
    console.log(blockScoped); // 에러: blockScoped is not defined​
  • 같은 스코프 내에서 같은 이름으로 let 변수를 재선언할 수 없습니다.
    let myVar = 1;
    let myVar = 2; 
    // SyntaxError: Identifier 'myVar' has already been declared
  • 초기화 하지 않는 let 변수는 undefined 값을 가집니다.
    let myVar;
    console.log(myVar); // 출력: undefined​
  • 호이스팅이 발생하지만, var와 달리 초기화 단계가 없어 선언 전에 접근하려고 하면 참고 에러 발생합니다.
    console.log(hoistedVar); // ReferenceError: Cannot access 'hoistedVar' before initialization
    let hoistedVar = "호이스팅!";​

const

const 특징

  • let과 같이 블록 스코프를 가집니다.
    if (true) {
        const blockScoped = "나는 블록 스코프 안에 있어요";
        console.log(blockScoped); // 출력: 나는 블록 스코프 안에 있어요
    }
    // console.log(blockScoped); // ReferenceError: blockScoped is not defined​
  • 선언과 동시에 초기화를 해야합니다.
    const initializedAtDeclaration; // SyntaxError: Missing initializer in const declaration​
  • 한번 할당된 값을 변경할 수 없습니다. 객체나 배열의 경우 내부 상태를 변경할 수 있습니다.
    const immutableValue = "변경할 수 없어요";
    // immutableValue = "변경하려고 하면 에러가 발생해요"; // TypeError: Assignment to constant variable.
    const obj = { key: "value" };
    obj.key = "newValue"; // 가능
    console.log(obj.key); // 출력: newValue​
  • 같은 스코프 내에서 같은 이름으로 const 변수를 재선언할 수 없습니다.
    const redeclare = "처음 선언했어요";
    const redeclare = "재선언하려고 하면 에러가 발생해요"; 
    // SyntaxError: Identifier 'redeclare' has already been declared​
  • 호이스팅이 발생하지만, let과 마찬가지로 선언 전에 접근하려면 참조 에러가 발생합니다.
    console.log(hoistedConst); // ReferenceError: Cannot access 'hoistedConst' before initialization
    const hoistedConst = "호이스팅은 발생하지만, 초기화 전에 접근하면 에러가 발생해요";​

결론

  • var는 오래된 프로젝트나 코드에서 주로 보이며,  현대 자바스크립트에서는 let과  const의 사용을 권장합니다.
  • 변수의 값이 변할 수 있을때 let, 변할수 없는 상수를 선언할 때는 const 사용합니다
  • let과 const는 더 엄격하고 명확한 스코프 관리를 가능하고 코드의 안정성을 높여줍니다.

See Other

profile

IdoCleanCode

@IdoCleanCode

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!