메모리와 변수
- 메모리(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」 -이웅모
'FrontEnd > 모던 자바스크립트 deep dive' 카테고리의 다른 글
Chapter 06. 데이터 타입(data type) (0) | 2023.10.01 |
---|---|
Chapter 03. 자바스크립트 개발 환경과 실행 방법 (0) | 2023.09.28 |
Chapter 01. 프로그래밍 Chapter 02.자바스크립트란? (0) | 2023.09.28 |