[사전 스터디 Week 2] var, let, const 차이점

Gaeun·2022년 11월 17일
0

wecode 사전 스터디

목록 보기
6/14

var, let, const 키워드의 차이점을 [Week 2 사전스터디 Q&A session]에서 멘토 경현님이 설명해주신 것과 <모던 자바스크립트 Deep Dive>를 토대로 정리해보려고 한다.

프로그래밍?

프로그래밍 언어를 사용해 컴퓨터에게 실행을 요구하는 일종의 커뮤니케이션

  • 데이터와 연산에 이름을 붙이고, 문법에 맞게 컴퓨터에게 설명하는 행동
    • 우리는 뇌에 저장해서 기억을 하는 반면, 컴퓨터는 메모리에 저장한다.

프로그래밍 언어?

  • 컴퓨터와의 대화(명령)에 사용되는 일종의 표현 수단으로, 사람과 컴퓨터 모두가 이해할 수 있는 약속된 형태의 인공어
  • 구문(syntax)와 의미(semantics)의 조합으로 표현
  • 프로그래밍 언어가 제공하는 문법을 적절히 사용하여 변수를 통해 값을 저장하고, 연산자로 값을 연산, 평가하고 조건문과 반복문에 의한 흐름제어로 코드의 실행 순서를 제어하고 함수로 재사용 가능한 문의 집합을 만들며 객체, 배열 등으로 자료를 구조화한다.

즉, 프로그래밍은 요구사항의 집합을 분석해서 적절한 자료구조와 함수의 집합으로 변환한 후, 그 흐름을 제어하는 것이다.

// 명령형 프로그래밍
// 물을 얼려서, 얼음이 되면, 컵에 담고, 커피를 담고, 물을 담아라
// -> 아이스 아메리카노 만드는 함수
function getIcedAmericano(){

}

// 선언형 프로그래밍
getIcedAmericano()

이름을 붙인다는 것?

  • 변수 선언: 데이터(값)을 저장한다는 것 → 명사라고 생각할 것
  • 함수 선언: 연산(행동)을 저장하는 것 → 동사라고 생각할 것
    • cf. 함수는 변수나 데이터가 없으면 아무 것도 할 수 없다.
    • 함수 저장: 명령을 저장하는 것

변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다. 간단히 말하자면, 값의 위치를 가리키는 상징적인 이름이다.

이 포스트에서는 함수보다 변수, 특히 변수 선언 키워드에 집중하고 있으므로 아래에서부터는 변수 키워드에 대해 정리한다.

변수

변수의 life cycle

선언 → 초기화 → 할당

변수 선언

  • 변수를 생성하는 것.
  • 값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것.
  • 변수 이름을 등록해서 자바스크립트 엔진에 변수의 존재를 알린다.

변수 초기화

  • 변수가 선언된 이후 최초로 값을 할당하는 것.
  • 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화한다.

값의 재할당

  • 이미 값이 할당되어 있는 변수에 새로운 값을 또다시 할당하는 것.
  • 재할당은 변수에 저장된 값을 다른 값으로 변경한다. 그렇기 때문에 변수라고 하는 것이다.
  • 만약 값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없다면 변수가 아니라 상수라 한다.

var, let, const

  • 변수를 사용하려면 반드시 선언이 필요하다.
  • 변수를 선언할 때 사용되는 키워드들이 var, let, const이다.

var: 재선언, 재할당 가능

var variable // 선언 및 undefined로 초기화
variable = 'variable' // 할당

var variable // 재선언

variable = 'changed' // 재할당

var 키워드로 선언한 변수의 문제점

  • 변수 중복 선언 허용: 의도치않게 먼저 선언된 변수 값이 변경되는 부작용 발생
  • 함수 레벨 스코프: var 키워드로 선언한 변수는 오로지 함수 코드 블록만을 지역 스코프로 인정한다. 따라서 함수 외부에서 var 키워드로 선언한 변수는 코드 블록 내에서 선언해도 모두 전역 변수가 된다.
  • 변수 호이스팅: 변수 호이스팅에 의해 var 키워드로 선언한 변수는 변수 선언문 이전에 참조할 수 있다. 이는 에러를 발생시키지는 않지만 프로그램의 흐름상 맞지 않을 뿐더러 가독성을 떨어트리고 오류를 발생시킬 여지를 남긴다.

var 키워드의 여러 단점을 보완하기 위해 ES6에서 letconst 키워드가 도입되었다.

let: 재선언 불가능, 재할당 가능

let variable // 선언 및 undefined로 초기화 
variable = 'variable' // 할당

let variable // 재선언 불가능 
// SyntaxError: Identifier 'variable' has already been declared.

variable = 'changed' // 재할당

var 키워드와의 차이점을 중심으로 본 let 키워드의 특징

  • 변수 중복 선언 금지
  • 블록 레벨 스코프
  • 변수 호이스팅: 변수 호이스팅이 발생하지 않는 것처럼 동작하지만 여전히 호이스팅이 발생하기 때문에 참조 에러가 발생한다.
    • let 키워드로 선언한 변수는 선언 단계와 초기화 단계가 분리되어 진행된다.
    • 런타임 이전에 자바스크립트 엔진에 의해 암묵적으로 선언 단계가 먼저 실행되지만 초기화 단계는 변수 선언문에 도달했을 때 실행된다.
    • 만약 초기화 단계가 실행되기 이전에 변수에 접근하려고 하면 참조 에러가 발생한다.
    • 스코프의 시작 지점부터 초기화 단계 시작 지점(변수 선언문)까지 변수를 참조할 수 없으며, 이 구건을 일시적 사각지대(TDZ)라고 부른다.
// 런타임 이전에 선언 단계 실행. 아직 변수 초기화 X
// 초기화 이전의 일시적 사각지대에서는 변수를 참조할 수 없다.
console.log(foo); 	// ReferenceError: foo is not defined

let foo; // 변수 선언문에서 초기화 단계가 실행
console.log(foo); 	// undefined

foo = 1; // 할당문에서 할당 단계가 실행
console.log(foo);	// 1

🚨 Note! 🚨
변수 호이스팅: 자바스크립트는 ES6에서 도입된 let, const를 포함해서 모든 선언(var, let, const, function, function*, class등)을 호이스팅한다. 단, ES6에서 도입된 let, const, class를 사용한 선언문은 호이스팅이 발생하지 않는 것처럼 동작한다.

const : 재선언 불가능, 재할당 불가능

const variable // 선언만 불가능 
// SyntaxError: Missing initializer in const declaration.

const variable = 'variable' // 선언과 초기화를 동시에 해야만 함

const variable // 재선언 불가능 
// SyntaxError: Identifier 'variable' has already been declared.

variable = 'changed' // 재할당 불가능
// TypeError: Assignment to constant variable.

const 키워드는 상수를 선언하기 위해 사용한다. 하지만 반드시 상수만을 위해 사용하지는 않는다. const 키워드의 특징은 let 키워드와 대부분 동일하므로 let 키워드와 다른 점을 중심으로 정리한다.

const 키워드의 let 키워드와의 차이점

  • 선언과 초기화: const로 선언한 변수는 반드시 선언과 동시에 초기화해야 한다.
  • 재할당 금지
  • 상수: 재할당이 금지된 변수
    • const 키워드로 선언한 변수에 원시 값을 할당한 경우 변수 값을 변경할 수 없다. 이러한 특징을 이용해 const 키워드를 상수를 표현하는 데 사용하기도 한다.
    • 상태 유지와 가독성, 유지보수의 편의를 위해 적극적으로 사용해야 한다.
  • const 키워드와 객체: const 키워드로 선언된 변수에 객체를 할당한 경우 값을 변경할 수 있다.
    • const 키워드는 재할당을 금지할 뿐 "불변"을 의미하지 않는다.

Summary

변수 선언에는 기본적으로 const를 사용하고 let은 재할당이 필요한 경우에 한정해 사용하는 것이 좋다. const 키워드를 사용하면 의도치 않은 재할당을 방지하기 때문에 좀 더 안전하다.

  • ES6를 사용한다면 var 키워드를 사용하지 않는다.
  • 재할당이 필요한 경우에 한정해 let 키워드를 사용한다. 이때 변수의 스코프는 최대한 좁게 만든다.
  • 변경이 발생하지 않고 읽기 전용으로 사용하는(재할당이 필요 없는 상수) 원시 값과 객체에는 const 키워드를 사용한다. const 키워드는 재할당을 금지하므로 var, let 키워드보다 안전하다.

변수를 선언하는 시점에는 재할당이 필요할지 잘 모르는 경우가 많다. 그리고 객체는 의외로 재할당하는 경우가 드물다. 따라서 변수를 선언할 떄는 일단 const 키워드를 사용하자. 반드시 재할당이 필요하다면 그때 const 키워드를 let 키워드로 변경해도 결코 늦지 않다.

참고

  • 모던 자바스크립트 Deep Dive

참고하면 좋을 자료

profile
🌱 새싹 개발자의 고군분투 코딩 일기

0개의 댓글