3,4장. 변수

메모리란?

데이터를 저장할 수 있는 메모리 셀(memory cell)의 집합체.

메모리 셀 하나의 크기는 1byte(=8bit)이며, 컴퓨터는 1바이트 단위로 데이터를 save 및 read한다.

변수란?

하나의 값을 저장하기 위해 확보한 메모리 공간이다.

할당과 참조의 차이

할당 : 변수에 값을 저장하는것

참조 : 변수에 저장된 값을 읽어들이는 것

식별자

일반적으로 변수의 이름을 식별자라고도 한다.

식별자는 값이 아니라 메모리 주소를 기억하고 있다.

키워드 (var, let, const)

var : ES6이전의 JS 변수 선언 키워드이며, 함수 레벨 스코프를 지원한다. (함수 내부에 선언된 변수 외에는 전부 지역변수 취급함)

let : ES6에서의 변수 선언 키워드이며, 블록 레벨 스코프를 지원한다.

const : ES6에서의 상수 선언 키워드이며, 블록 레벨 스코프를 지원한다.

  1. var로 선언한 변수는 선언 전에(코드상 위쪽에서) 사용해도 에러가 나지 않지만 let, const는 에러가 난다. (let,const는 초기화를 안해주기 때문이다.)
  2. var는 이미 선언되어 있는 변수명을 다시 써도 에러가 나지 않는다.
  3. var, let은 선언 시에 초기값을 주지 않아도 되지만 const는 초기값을 반드시 할당해야 한다.
  4. const는 상수이므로 한번 할당한 값을 변경할 수 없지만, 객체인경우 객체의 메모리주소를 변경할 수 없을 뿐 내부의 값을 변경 가능하다!(즉, 객체 안의 property가 변경되는것까지는 막지 못한다)

var에 대하여

  1. 선언 단계 : 변수 이름을 등록해서 JS엔진에 변수의 존재를 알린다.
  2. 초기화 단계 : 값을 저장하기 위한 메모리 공간을 확보하고 암묵적으로 undefined를 할당해 초기화한다.

호이스팅

var, let, const, function, function*, class 키워드를 사용하는 모든 식별자는 호이스팅된다.

JS는 코드를 실행하기 전, '코드 평가 과정'을 거치는데, 이 때 변수 선언문을 미리 실행해두기 때문에 나중에 선언된 변수도 앞의 코드에서 참조할 수 있게 된다.

이를 변수 호이스팅이라고 한다.

  • var : 코드 평과 가정에서 선언과 (일단 undefined로)초기화 동시에 수행
var foo = 1;
{
  console.log(foo); // 1 출력
  var foo = 2;
}

/*----------------------------------*/

console.log(foo); // undefined 출력
var foo = 1;
  • let, const : 코드 실행 과정에서 변수 선언문을 만났을때 초기화 수행
let foo = 1;
{
  console.log(foo); // 블록 내부의 foo가 초기화가 안됐기 때문에 Referrence Error 출력
  let foo = 2;
}

/*----------------------------------*/

console.log(foo); // foo가 아직 초기화가 안됐기 때문에 Referrence Error출력
let foo = 1;

let, const는 블록레벨 스코프이므로 블록 안에 있는

let foo = 2;

가 이미 호이스팅 되었기 때문에 블록 바깥의 foo = 1을 출력하지 못한다.

undefined

JavaScript에서 제공하는 원시 타입의 값이다.

6장에서 자세히 다룰것이므로 일단 넘어감!

실행 컨텍스트

  1. JS엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고, 코드의 실행 결과를 실제로 관리하는 영역이다.
  2. 식별자와 스코프를 관리한다.
  3. 변수이름과 값은 K:V 형식으로 등록되어 관리된다. (13장, 23장에서 자세히 다룰것)

값의 재할당

값을 재할당하면 다른 메모리에 값을 재할당한다.

버려진 메모리는 가비지 콜렉터에 의해 자동 해제된다.

단, 언제 해제될지는 예측할 수 없다.

var score = 80; // 변수 선언과 값의 재할당(undefined -> 80)
score = 90; // 값의 재할당
Last Updated: