FrontEnd/모던 자바스크립트 deep dive

Chapter 04. 변수

계란💕 2023. 10. 1. 00:45

메모리와 변수

  • 메모리(memory)는 메모리 셀의 집합체다. 
  • 메모리 셀 하나는 1바이트(8비트)이며 컴퓨터는 메모리 셀의 크기, 즉 1바이트 단위로 데이터를 저장하거나 읽는다. 
  • 각 셀은 고유하게 메모리 주소(memory address)를 갖는다. 
  • ex) 4GB 는 0 ~ 4,294,967,295 (0x00000000 ~ 0xFFFFFFFF) 까지의 메모리 주소가 있다. 
  • 컴퓨터는 모든 데이터를 2진수로 처리한다. 따라서 데이터가 숫자, 텍스트, 이미지, 동영상인지에 상관없이 모두 2진수로 저장된다. 
  • 메모리에 저장되는 값은 모두 2진수로 저장된다. 

 

 

  Ex) 10 + 20 이라는 식을 컴퓨터는 어떻게 처리할까?

  •  사람은 계산, 기억을 두뇌에서 하지만 컴퓨터는 연산과 기억을 수행하는 부품이 나눠져있다. 
  • 피연산자인 10, 20은 메모리 상의 임의의 위치에 저장되고 CPU는 이 값을 읽어서 연산을 수행한다. 
  • 결괏값인 30은 또 다른 메모리 주소에 저장된다. 
  • 저장되었으나 저장된 30을 재사용할 수가 없다. 
  • 메모리 공간에 직접 접근하는 것은 치명적 오류를 발생시킬 수 있기 때문에 자바스크립트는 개발자의 직접적인 메모리 제어를 허용하지 않는다. 
  • "변수" 등장

 

  • 프로그래밍 언어는 어떤 값을 메모리에 저장하고 그 값을 재사용하기 위해서 '변수' 메커니즘을 제공한다. 
  • 변수(variable): 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름을 말한다. 값의 위치를 가리키는 상징적인 이름이다. 
  • 변수는 프로그래밍 언어의 인터프리터 또는 컴파일러에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행된다. 
  • 따라서, 메모리 주소를 직접 사용할 필요 없이 변수를 통해 데이터에 접근 가능하다. 

 


식별자

  • 식별자: 변수명을 식별자 라고도 한다. 어떤 값을 구별할 수 있는 고유한 이름을 말한다. 
  • 식별자는 어떤 값이 저장되어 있는 메모리 주소를 저장해야한다. 
  • 메모리 주소에 붙인 이름을 식별자라고 볼 수 있다. 
  • 변수, 함수, 클래스 등의 이름은 모두 식별자다. 

 


변수 선언

  • 변수를 생성하는 것을 말한다. 
  • 값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장하도록 준비하는 것이다. 
  • 변수 선언에 의해 확보된 공간은 메모리가 해제되기 전까지 누구도 해당 공간을 사용할 수 없어서 안전하게 보호된다. 
  • ES6 이 도입되기 전까지 변수 선언은 var 키워드만 사용 가능했다. 
    • var 키워드의 큰 단점: 블록 레벨 스코프(block level scope)를 지원하지 않고 함수 레벨 스코프를 지원한다. 의도치 않게 전역 변수가 선언되어 심각한 부작용이 발생된다. 
  • 변수 이름을 비롯한 모든 식별자는 모두 실행 컨텍스트(execution context)에 등록된다. 
    • 실행 컨텍스트: 자바스크립트 엔진이 소스코드를 평가하고 실행하기 위해 필요한 환경을 제공하고 코드의 실행 결과를 실제로 관리하는 영역
    • 자바스크립트 엔진은 실행 컨텍스트를 통해 식별자, 스코프를 관리한다. 
  • ex) var score; 와 같이 선언하기만 하는 경우, undefined 가 할당되어 초기화된다. 
    • undefined 는 자바스크립트의 원신 타입 중 하나다. 
    • 왜 초기화할까?
    • 만약 초기화하지 않으면 확보된 메모리 공간에 이전에 다른 애플리케이션에서 사용했던 값(쓰레기 값)이 남아있을 수 있기 때문이다. 

 


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

  • 자바스크립트 엔진은 소스 코드를 실행하기 전에 소스 코드의 평가 과정에서 변수 선언을 포함한 모든 선언문(변수 선언문, 함수 선언문 등)을 소스 코드에서 찾아서 먼저 실행한다. 
  • 소스 코드의 평가 과정이 끝나면 모든 선언문을 제외하고 소스 코드를 한 줄 씩 순차적으로 실행한다. 
  • 변수 호이스팅(variable hoisting): 변수 선언문이 코드의 선두로 끌어올려진 것처럼 동작하는 자바스크립트 고유 특징.

 


값의 할당

  • 변수 선언은 소스 코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만, 값의 할당은 런타임에 실행된다. 
  • 만약 값을 재할당할 수 없어서 변수에 저장된 값을 변경할 수 없다면 상수(constant)라고 한다.

 


가비지 콜렉터(gabage collector)

  • 애플리케이션이 할당한 메모리 공간(어떤 식별자도 참조하지 않는 메모리 공간)을 주기적으로 검사하여 사용하지 않는 메모리를 해제하는 기능.
  • 자바스크립트는 가지비 콜렉터를 내장해서 메모리 누수를 방지한다. 

 

cf) 언매니지드 언어 (unmanaged language) vs 매니지드 언어(managed language)

  • 프로그래밍 언어는 메모리 관리 방식에 따라 둘로 나뉜다. 
  • 언매니지드 언어: 개발자가 명시적으로 메모리를 할당하고 해제하기 위해 malloc(), free() 같은 저수준 메모리 제어기능을 제공한다.   ex) C언어
  • 매니지드 언어: 메모리 할당 해제를 위한 메모리 관리 기능을 언어적 차원에서 담당하고 개발자의 직접적인 제어를 허용하지 않는다. 가비지 콜렉터가 메모리를 해제한다.     ex) 자바스크립트, Java

 

  Ex) var score;   score = 50;   score = 80;

  • 위의 식을 보면 score를 선언했을 때, 어떤 메모리 주소 a에 undefined가 할당되고 
  • score = 50을 할당하면 a에서 불필요한 값이 해제되고 새로운 메모리 주소 b에 50이 들어간다. 

 


title

  • con
  • con

 

출처 - 「모던 자바스크립트 deep dive」 -이웅모