변수 선언
Javascript는 동적인 프로그래밍 언어이다. 이 말은 Javascript코드는 작성할 때 변수의 타입이 정해지는 것이 아니라 실행되는 런타임환경에서 정해진다는 말과 같다. 변수 또한 타입이 런타임 환경에서 정해진다. 그러나 개발자는 예측할 수 있는 변수는 고려하여 작성해야 한다. let과 var는 변수로 작성하고 const는 상수일때 작성해 준다. 세 가지 모두 각각 다른 특징을 가지고 있다. 아래에서 자세히 살펴보자.
let
let은 블록스코프(block-scoped) 변수를 선언할 때 사용한다. 이는 변수가 선언된 블록 내에서만 유효하게 사용할 수 있다는 것을 의미한다. 다른 블록스코프에서 let으로 작성된 같은 이름의 변수가 선언되어도 서로 영향을 주지 않는다. 이렇게 작성함녀 코드의 가독성과 변수의 충돌 방지에 큰 도움을 줄 수 있다.
또한, let은 변수를 선언한 이후에 값을 재할당할 수 있다. 값이 바뀔 여지가 있는 변수는 let으로 작성해 주면 된다.
{
let x = 10;
console.log(x); // 10
}
console.log(x); // x is not defined
위 코드에서 x는 블록스코프{} 내에 위치하고 있다. 스코프 안에서의 콘솔은 x의 값이 잘 출력된다.
아래의 콘솔은 스코프 밖에 위치하고 있다. let은 스코프 내에서만 유효하므로 x가 출력되지 않는다.
var
let과 var는 변수를 선언하는 키워드지만, var는 이전 버전의 javascript에서 사용하던 키워드이기 때문에 보통 let을 사용한다. var는 let과 유사한 점이 많다. 변수를 선언할 때 사용하고 변수의 값을 변경할 수 있다. 그러나 let의 블록스코프 특징과는 다르게 var는 글로벌 스코프를 적용한다. 즉, 변수를 선언한 모든 곳에서 변수의 값을 사용할 수 있다는 것이다. 이는 의도치 않은 변수 충돌을 일으킬 수 있다.
var x = 5;
console.log(x) // 5
{
var x = 10;
console.log(x); // 10
}
console.log(x); // 10
var는 스코프와 관계없이 최초 작성된 x의 값을 덮어버린다. 그래서 이후에 작성된 변수명과 같게 되면 의도치않은 충돌을 일으킬 수 있다는 뜻이다.
const
const는 불변(immutable)변수를 선언할 때 사용한다. 한 번 값을 할당하면 이후에 변경하면 안 되고 변경도 안된다. 세부적으로는 변수가 가리키는 메모리 주소를 변경할 수 없다는 말이다. 그러나 const로 선언된 객체나 배열의 내부 요소는 변경될 수 있다.
const name = "정인";
name = "냐옹";
// 에러 발생
const age = 28;
age = 40;
// 에러 발생
const gender = "남성";
gender = "여성";
// 에러 발생
위의 작성된 name, age, gender는 const로 선언된 값이다. const로 작성 후 값을 변경하려고 하면 에러가 발생한다. const로 작성하면 변수의 값을 잘못 변경하는 실수를 방지할 수 있다.
const로 배열 혹은 객체로 저장한 경우, 내부 요소를 바꾸는 것은 가능하다. 변수가 저장된 메모리값을 바꾸는 것은 아니기 때문이다.
const 친구들 = ['준수', '지수', '홍수'];
친구들.push('박수')
console.log(친구들) // ['준수', '지수', '홍수', '박수']
변수 선언 방식의 선택
변수 선언 방식을 선택할 때, 변수의 유효하게 작용될 범위를 예측하여 사용하여야 한다. 개발자의 의도에 따라서 적절하게 변수키워드를 사용한다면 코드의 가독성과 유지보수성을 개선할 수 있을 것이다.
'TIL' 카테고리의 다른 글
[JS] 실행컨텍스트 (0) | 2023.07.14 |
---|---|
[JS] 화살표함수(Arrow Function)와 this (0) | 2023.07.10 |
[JS] e.preventDefault() & e.stopPropagation() (0) | 2023.07.08 |
[프로그래머스] includes, indexOf, search의 공통점과 차이점 (0) | 2023.07.06 |
[JS] API & fetch (0) | 2023.07.01 |