앱 만들기/JavaScript study

var 과 let 예약어 차이점

나도처음이야 2023. 1. 13.
반응형

자바스크립트 ES6버전(2015년 발표) 이후에는 let 예약어를 사용해서 변수를 선언하는 것을 추천하고 있습니다.

var 를 사용한다고 해서 큰 일이 나는 것은 아니나, var 예약어가 가지는 예상치 못한 코딩 실수를 줄여주기 위한 기능이 let 에는 들어있기에 권장하고 있다고 생각됩니다.

오늘은 var 과 let 의 차이점을 알아 보겠습니다.

 

먼저, 하기 예제로 var 예약어가 가지는 약점들을 확인 해 봅니다.

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h1>let 예약어 예제</h1>  
  <script>
        
    function sumvar(){ 
        // 1. 실수로 var 생략시 전역변수가 됨
        var sum = 0;      
        for(var i = 1; i <= 10; i++){
           sum += i;
        }
        alert("1~10의 합은 ? " + sum);
        /* 2. 재선언 가능  */ 
        var sum = 2;
        console.log("재선언 및 초기화 된 값은 ? " + sum);
        /* 3. hoisting 됨 : 인터프리터 가 변수와 함수 메모리공간을 선언전에 미리 할당 하는 것을 의미함.*/
        console.log( "hoisting var= " + hoisting);
        // 오류를 발생하지 않고 undefined 로 나옴.
        var hoisting = 100 ;

    }
    // 1. var예약어를 실수로 지웠을경우, 전역변수가 되어서 의도치 않게 외부에서 수정이 가능하게됨.
    // 2. var예약어를 사용한 변수는 다시 선언이 가능하다. 값이 변경된다.
    // 3. 호이스팅이 발생한다.
    
    //함수 호출
    sumvar();   
    
  </script>
</body>
</html>

var 약점은 3가지로 뽑아 볼 수 있습니다.

위 주석처럼, 첫버째는 변수 선언시 예약어를 적지 않으면 전역변수로 선언이 되기에, 나의 의도와 별개로 동작을 할 가능성 이 있습니다.

두번째, 자유도가 높은 자바스크립트가 가지는 특색 중 하나라고 생각합니다.

 (자바에서는 생각치 못한 내용 입니다.)  한번 선언한 변수의 재선언 입니다. 역시 프로젝트 내에서 오류를 발생할 여지가 생깁니다.

마지막으로 호이스팅이 발생합니다. 즉, 변수 및 함수 선언을 하지 않고 변수나 함수를 사용하면 당연히 오류가 나와야 하지만 var 로 선언된 변수의 경우 선언이 이미 되었다고 생각하고 할당되지 않았다는 undefined 를 반환 합니다.

 

이런 상황들을 정리해보면, var 를 쓴다고 해서 큰일이 당장 나는 것은 아닙니다.

하지만, 큰 프로젝트 혹은 소스의 양이 많아질 수록 실수가 나올 확률이 높아지는 것은 사실 입니다.

 

그렇기에 위 예제를 let 예약어를 사용해서 하기처럼 변경하면  관련 문제들을 사전에 막을 수 있습니다.

function sumlet(){ 
        // 1.블럭 안에서만 사용가능 함.
        let sum = 0;      
        for(var i = 1; i <= 10; i++){
           sum += i;
        }
        alert("1~10의 합은 ? " + sum);
        /* 2.재선언 불가능  */ 
        //let sum = 2;
        //console.log("재선언 및 초기화 된 값은 ? " + sum);
        /* 3. hoisting 됨 : 인터프리터 가 변수와 함수 메모리공간을 선언전에 미리 할당 하는 것을 의미함.*/
        console.log( "hoisting let= " + hoisting);
        // 오류를 발생함.
        let hoisting = 100 ;

    }
    sumlet();

let은 블럭문 안에서만 사용됩니다. 전역 변수로 사용이 불가합니다. 즉, 조금더 안전해 질 수 있습니다.

let 으로 선언된 변수는 내가 사용하고 싶은 블럭문 안에서만 동작한다라고 인터프리터에게 말해 주었으니 말이죠.

 

두번째 위 예제처럼, 동일 스코프 안에서는 재선언이 불가능 합니다. 오류를 발생하므로 코딩시 손쉽게 오류를 방지 할 수 있습니다.

마지막으로, let 예약어로 선언된 변수는 호이스팅을 하지 않기에 잘못된 변수 할당이 되는 것을 막아줍니다.

그렇기에, 하기처럼 코딩을 유도하게 됩니다.

 

 let hoisting = 100 ; //안전하게 변수 선언 및 할당을 하고

 console.log( "hoisting let= " + hoisting); // 해당 변수를 사용 한다.

 

참고로, 자바스크립트에서 호이스팅 이란 

인터프리터 가 변수와 함수 메모리공간을 선언전에 미리 할당 하는 것을 의미 합니다. 

호이스팅으로 의도치 않게 오류가 발생하면 안되겠습니다.

감사합니다

반응형

댓글