언어/JavaScript

[자바스크립트 딥다이브] 4장 변수

홍시_코딩기록 2024. 3. 26. 23:58

3장은 실행 방법이어서 점프했다.

4장 변수

10 + 20
  • 사람은 계산과 기억을 모두 두뇌에서 하지만 컴퓨터는 연산과 기억을 수행하는 부품이 나뉘어져 있다.
  • 컴퓨터는 CPU를 사용해 연산하고, 메모리를 사용해 데이터를 기억한다.

 

(컴퓨터 10 + 20 계산)

  • 메모리는 데이터를 저장할 수 있는 메모리 셀의 집합체. 메모리 셀하나 크기는 1바이트(8비트) 컴퓨터는 메모리 셀의 크기, 즉 1바이트 단위로 데이터를 저장하거나 읽는다.
  • 각 셀은 고유의 메모리 주소를 갖는다. 이 주소는 메모리 공간의 위치를 나타냄.
  • 예제의 10과 20은 메모리 상의 임의의 위치(메모리 주소)에 기억(저장)되고 CPU는 이 값을 읽어 들여 연산을 수행. 결과 값인 30도 메모리 상의 임의의 위치에 저장된다. (편의상 10진수로 표현했지만 메모리에 저장되는 모든 값은 2진수)

 

변수

  • 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인이름
  • 값의 위치를 가리키는 상징적인 이름.
var result = 10 + 20;
  • 생성된 값 30은 메모리 공간에 저장되어 다시 재사용할 수 있도록 값이 저장된 메모리 공간에 상징적인 이름을 붙인 것이 변수

 

변수 선언

  • 변수 선언 === 변수 생성 값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장할 수 있게 준비하는 것.
var score;
  • 변수에 값을 할당하지 않아서 메모리 공간이 비어있을 것 같지만 undefined라는 값이 암묵적으로 할당되어 초기화된다.

 

변수 선언의 실행 시점과 변수 호이스팅

console.log(Score); //undefined

var score; //변수 선언문
  • 자바스크립트는 인터프리터에 의해 한 줄씩 순차적으로 실행되므로 console이 먼저 실행됨. 콘솔이 먼저 실행됐지만 참조 에러가 발생하지 않고 undefined가 출력됨. 이유는? 변수 선언이 소스코드가 한 줄씩 순차적으로 실행되는 시점, 즉 런타임이 아니라 그 이전 단계에서 먼저 실행되기 때문.
  • 변수 선언이 소스코드의 어디에 있든 상관없이 다른 코드보다 먼저 실행 변수 선언문이 코드의 선두로 끌어 올려진 것처럼 동작하는 자바스크립트 고유의 특징을 변수 호이스팅 이라고 함.
  • 변수 선언뿐 아니라 var, let, const, function, function*, class 키워드를 사용해서 선언하는 모든 식별자는 호이스팅 된다.

 

값의 할당

var score = 80;

** 변수 선언과 값의 할당의 실행 시점이 다름 **

  • 변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 실행
  • 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행
console.log(score); //undefined

var score; //1 변수 선언
score = 80; //2 값의 할당
//var score = 80
 
console.log(score); // 80
  • 1.은 런타임 이전에 실행, 2는 런타임에 실행 따라서 score변수에 값을 할당하는 시점(2)에는 이미 변수 선언이 완료된 상태이며, 이미 undefined로 초기화 되어있다. (undefined 에서 80으로 값이 변경되는 것(재할당))
  • var score = 80; 하나의 문장으로 단축해도 자바스크립트 엔진은 변수의 선언과 값의 할당을 2개로 나누어 각각 실행. undefined가 저장되어 있던 메모리 공간에 80이 들어가는 것이 아니라 새로운 메모리 공간을 확보하고 그 곳에 80을 저장함.

 

값의 재할당

var score = 80;
score = 90;
  • 변수에 저장된 값을 다른 값으로 변경
  • const : 단 한번만 할당할 수 있는 변수를 선언. 상수를 표현

(값의 재할당 메모리 공간)

  • 현재 scroe는 90. 이전 undefined와 80은 어떤 변수도 값으로 갖고 있지 않다.
  • 이런 불필요한 값들은 가비지 콜렉터에 의해 메모리에서 자동 해제된다. 언제 해제될지는 예측못함.

 

💡 가비지 콜렉터 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제하는 기능을 말한다. 어떤 식별자도 참조하지 않는 메모리 공간.

 

 


변수 사용 방법은 아니까 메모리 구조에 대해 더 집중해서 보았다.