let,const 키워드

rain98·2021년 1월 6일
0

자바스크립트

목록 보기
4/4
post-thumbnail

var 키워드의 문제점🔥

ES5까지 변수를 선언할 수 있는 유일한 방법은 var 키워드를 사용하는것이었다고한다.
하지만 var는 주의를 기울이지 않으면 심각한 문제를 발생시킬 수 있다.

1.변수 중복 선언 허용

var 키워드로 선언한 x변수와 y변수는 중복 선언되었다.
초기화문이 있는 변수 선언문은 자바스크립트 엔진에 의해 var 키워드가 없는 것처럼 동작하고 초기화문이 없는 변수 선언문은 무시된다. 이때 에러는 발생하지 않는다.

위 예제와 같이 만약 동일한 이름의 변수가 이미 선언되어 있는것을 모르고 변수를 중복 선언하면서 값까지 할당했다면 의도치 않게 먼저 선언된 변수 값이 변경되는 부작용이 발생한다.

즉 var 키워드로 선언한 변수를 중복 선언을 하면 코드의 목적과는 다르게 코딩이 될 수 있다.

2.함수 레벨 스코프

var 키워드로 선언한 변수는 오로지 함수의 코드 블록만ex : (){}을 지역 스코프로 인정한다. 함수 외부에서 var 키워드로 선언한 모든 변수는 코드 블록 내에서 선언해도 모두 전역 변수가 된다.


이로 인해 의도치 않게 전역 변수가 중복 선언되는 경우가 발생한다.

3. 변수가 선언 되지 않았는데 참조 가능 (변수 호이스팅)

var 키워드로 변수를 선언하면 변수 호이스팅에 의해 변수 선언문이 스코프의 선두로 끌어 올려진 것처럼 동작한다.

변수가 생성이 되면 1. 선언 -> 2. 초기화 -> 3. 할당 이 3단계로 걸쳐 생성이 되는데 var의 문제점은 변수 선언 시 선언과 초기화가 동시에 이루어진다. 에러를 발생시키지는 않지만
프로그램의 흐름상 맞지 않을뿐더러 가독성을 떨어뜨리고 생각치도 못한 오류를 발생시킬 수 있다.

var의 단점을 보완시키는 let,const 키워드 👍

var 키워드의 단점을 보완하기 위해 ES6에서는 새로운 변수 선언 키워드 let과 const를 도입했다.

1. 변수 중복 선언 금지

var에서는 변수를 위에 선언 후 다시 아래에서 재 선언이 가능했기에 아무런 에러가 발생하지 않았다. 하지만 let과 const는 재 선언시 문법 에러(SystaxError)가 발생한다.

2. 블록 레벨 스코프

var 키워드로 선언한 변수는 오로지 함수의 코드 블록만을 지역 스코프로 인정하는 함수 레벨 스코프를 따른다. 하지만 let과 const 키워드로 선언한 변수는 모든 코드 블록을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.

3. 변수 호이스팅 불가

var 키워드로 변수 생성 시 선언과 초기화가 동시에 이루어 지기 때문에 호이스팅 현상이 일어났다.
하지만 let과 const 는 변수 생성 시 선언과 초기화가 분기되어서 진행이 된다.

let과 const의 차이점

const 키워드로 선언한 변수에 원시 값을 할당한 경우 변수 값을 변경할 수 없다.
이러한 특징을 이용해 const 키워드를 상수로 표현하는데 사용한다.
상수는 상태 유지와 가독성, 유지보수의 편의를 위해 적극적으로 사용한다.

부가가치세를 계산하는 코드로 예제를 통해 const의 필요성을 알아보자.

우리나라 부가가치세는 공급가액의 10%로 정해져있기 때문에 VAT 포함 금액 ÷ 1.1을 해주면 된다.
코드를 보자면

여기서 코드 내에서 사용한 0.1은 어떤 의미로 사용했는지 명확히 알기 어렵기 때문에 가독성이 좋지 않고 유지보수 또한 좋다고 할 수 없다.
또한 세율을 의미하는 0.1은 쉽게 바뀌지 않는 값이며 프로그램 전체에서 고정된 값을 사용하면 값의 의미를 쉽게 파악이 가능하다.

일반적으로 상수의 이름은 대문자로 선언해 상수임을 명확히 나타낸다.
여러 단어로 이뤄진 경우에는 언더스코어로 구분하여 스네이크 케이스로 표현하는 것이 일반적이다.

이렇게 const키워드를 활용하여 코드를 짜면 가독성도 좋아지며 유지보수성이 향상된다.


요약하자면

    1. ES6를 사용한다면 var 보다는 let을 쓰자
    1. 값을 재할당 한다면 let(변수), 재할당을 안한다면 const(상수)

-출처- 모던자바스크립트 Deep Dive

profile
헷갈리거나 기억에 남기고 싶은것을 기록합니다.

0개의 댓글