[JavaScript] 변수 선언 방식 (var/ let/ const)

2022. 11. 5. 18:15·프로그래밍 언어/JavaScript

var / let / const 란 무엇인가?

JavaScript 에서 변수 선언 시에 사용하는 예약어(키워드)

예약어(키워드) : 컴퓨터 프로그래밍 언어에서 이미 문법적인 용도로 사용되고 있기 때문에 식별자로 사용할 수 없는 단어들

1. var

ES6(ECMAScript6) 이전에 변수 선언 방식이다.

 

변수 선언 및 초기화 후에 값을 재할당할 수 있다.

 

동일한 변수명으로 중복 선언이 가능하다.

 

예시)

// 첫 번째 변수 선언 + 초기화
var a = 10;
console.log(a); // 결과값: 10

// 값 재할당
a = 20;
console.log(a); // 결과값: 20

// 두 번째 변수 선언 + 초기화
var a = 30;
console.log(a); // 결과값: 30

// 세 번째 변수 선언
var a;
console.log(a); // 결과값: 30

설명:

  • var 로 선언한 변수는 중복해서 선언(+초기화) 가 가능하다. (에러가 발생하지 않음.)
    • 이 경우, 마지막에 할당된 값이 변수에 저장된다.
  • 초기화 없이 선언만 한 경우에는 선언문 자체가 무시된다. (에러는 발생하지 않음.)

함수 레벨 스코프: 함수 내부에서 선언한 변수는 함수 내부에서만 참조가 가능하다.hello 함수 내부에서 선언된 변수는 함수 내부에서만 참조가 가능하며, 외부에서 참조 시 에러가 발생한다.

 

예시) 함수 내부에서 선언한 변수만 ‘지역변수’ 로 취급됨.

function hello() { 
    var a = 10; 
    console.log(a); 
} 

hello(); // 10 
console.log(a); // ReferenceError: a is not defined

예시) 함수를 제외한 영역에서 선언한 변수는 ‘전역변수’ 로 취급됨

if (true) {
    var a = 10;
    console.log(a); // 10
}
console.log(a); // 10

if문, for문, while문, try/catch 문 등의 코드 블럭{ ... } 내부에서 var로 선언된 변수는 전역변수로 취급되어 블럭 외부에서도 어디에서나 참조할 수 있다.

스코프 : 일반명사) 범위, 고유명사) 유효한 참조 범위

2. let

var 의 단점(중복 선언) 을 보완하기 위해 ES6(ECMAScript6) 에서 새로 등장한 변수 선언 방식이다.

 

변수 선언 및 초기화 후에 값을 재할당할 수 있다.

 

동일한 변수명으로 중복 선언이 불가능하다. (에러가 발생함.)

 

예시)

let a = 100;
console.log(a); // 결과값: 100

let a = 200;
console.log(a); // 에러 발생
// SyntaxError: Identifier 'a' has already been declared
// 중복 선언 불가

a = 300;
console.log(a); // 300
// 값 재할당은 가능함.

 

블록 레벨 스코프 : 함수 내부는 물론, if문이나 for문 등의 코드 블럭{ ... } 에서 선언된 변수도 지역변수로 취급한다.

 

예시) if문의 내부에서 let 으로 선언된 변수는 외부에서 참조되지 않는다.

if (true) {
    let a = 10;
    console.log(a); // 10
}
console.log(a); // ReferenceError: 'a' is not defined

예시) 함수 내부에서 let 으로 선언된 변수 또한 외부에서 참조되지 않는다.

function hello() {
    let a = 10;
    console.log(a); // 10
}

hello();
console.log(a); // ReferenceError: 'a' is not defined

 

3. const

let 과 동일하게 ES6(ECMAScript6) 에서 새로 등장한 변수 선언 방식이다.

 

let 처럼 동일한 변수명으로 중복 선언이 불가능하다. (에러가 발생함.)

 

let 과 다른 점은 변수를 처음에 한 번 선언하고 나면 값을 넣을 수 없다.

-> 값을 재할당하는 것이 불가능하다.

-> 보통 상수를 선언하는 키워드로 사용된다.

 

예시)

const a = 100;
console.log(a); // 결과값: 100

const a = 200;
console.log(a); // 에러 발생
// SyntaxError: Identifier 'a' has already been declared
// 중복 선언 불가

const a = 300;
console.log(a); // 에러 발생
// Assignment to constant variable
// 값을 재할당하는 것도 불가

 

 

블록 레벨 스코프 : 함수 내부는 물론, if문이나 for문 등의 코드 블럭{ ... } 에서 선언된 변수도 지역변수로 취급한다.

 

예시) if문의 내부에서 let 으로 선언된 변수는 외부에서 참조되지 않는다.

if (true) {
    const a = 10;
    console.log(a); // 10
}
console.log(a); // ReferenceError: 'a' is not defined

예시) 함수 내부에서 let 으로 선언된 변수 또한 외부에서 참조되지 않는다.

function hello() {
    let a = 10;
    console.log(a); // 10
}

hello();
console.log(a); // ReferenceError: 'a' is not defined

 

정리

  • var / let / const 는 JavaScript 에서 변수 선언 시에 사용되는 키워드(예약어) 이다.
  • var 는 ES6 이전부터 사용된 변수 선언 방식이다. 동일한 변수명으로 중복 선언이 가능하며, 값의 재할당이 가능하다.
  • let / const 는 var 의 단점(중복 선언) 을 보완하기 위해 ES6 에서 새로 등장한 변수 선언 방식이다.
  • let 은 동일한 변수명으로 중복 선언 시 에러가 발생하며, 값의 재할당이 가능하다.
  • const 는 동일한 변수명으로 중복 선언 시 에러가 발생하며, 값의 재할당이 불가능하다.
  • var 로 선언된 변수는 함수 레벨 스코프를 가지는데, 함수 내부에서 선언된 변수만 지역변수로 취급되며 그 외의 변수는 모두 전역변수로 취급된다.
  • let / const 로 선언된 변수는 블록 레벨 스토프를 가지는데, if문이나 for문 등의 코드 블럭{ ... } 에서 선언된 변수까지도 지역변수로 취급된다.

'프로그래밍 언어 > JavaScript' 카테고리의 다른 글

[JavaScript] 스코프(Scope)  (0) 2022.11.05
[JavaScript] 런타임 메모리 구조  (0) 2022.11.05
[JavaScript] Primitive Type(원시 타입) 과 Reference Type(참조 타입)  (0) 2022.11.05
[JavaScript] 자바스크립트 언어의 특징  (0) 2022.11.05
[Tip] function 은 되도록 사용하지 마세요.  (2) 2022.11.04
'프로그래밍 언어/JavaScript' 카테고리의 다른 글
  • [JavaScript] 스코프(Scope)
  • [JavaScript] 런타임 메모리 구조
  • [JavaScript] Primitive Type(원시 타입) 과 Reference Type(참조 타입)
  • [JavaScript] 자바스크립트 언어의 특징
rondeveloper
rondeveloper
  • rondeveloper
    Ron's learning record
    rondeveloper
  • 전체
    오늘
    어제
    • 분류 전체보기 (99) N
      • k8s (1) N
      • AWS (1)
      • 리눅스 (3)
      • Docker (8)
      • 라이브러리 & 프레임워크 (14)
        • React (2)
        • NestJS (8)
        • Spring (0)
        • Django (3)
        • FastAPI (1)
      • 웹 (2)
        • Nginx (1)
      • 프로그래밍 언어 (29)
        • HTML (0)
        • CSS (0)
        • JavaScript (21)
        • Python (3)
        • Node.js (0)
        • TypeScript (4)
        • Java (1)
      • Today I learned (9)
      • 알고리즘 (9)
        • 백준 (0)
        • 프로그래머스 (8)
        • 개념 (1)
      • 티끌모아 태산 (5)
        • 하루에 영단어 하나씩 (5)
        • 독서 (0)
      • 시행착오 (3)
      • 데이터베이스 (2)
        • MySQL (0)
      • 컴퓨터 과학 (8)
        • 네트워크 (2)
        • 운영체제 (0)
        • 데이터베이스 (2)
        • 자료구조 (4)
      • 포트폴리오 (4)
        • JJINCAFE IN SEOUL (4)
        • CODEUNICORN (0)
      • 회고 (0)
      • CICD (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    리눅스
    레벨2
    typescript
    nestjs
    기초
    Kubernetes
    javascript
    조인
    mysql
    Docker
    django
    typeorm
    IP 주소
    Python
    네트워크
    배열
    Kubectl
    쿠버네티스
    FastAPI
    도커
    프로그래머스
    코딩테스트
    컨테이너
    생활코딩
    iterable
    모듈
    redis
    Til
    자바스크립트
    스택
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
rondeveloper
[JavaScript] 변수 선언 방식 (var/ let/ const)
상단으로

티스토리툴바