- 변수
변수는 프로그래밍 언어에서 데이터를 관리하기 위한 핵심 개념이다.
자바스크립트 엔진이 이러한 코드를 계산하고 실행한다고 생각해보자.
10 + 20
JS엔진이 코드를 평가하려면 10,20,+라는 기호(리터럴과 연산자)의 의미를 알고 있어야 하며, 10 + 20이라는 식(표현식)의 의미도 파싱할수 있어야 한다. 표현식을 인지하고 연산자와 피연산자를 기억해야한다.
사람은 두뇌를 통해 연산하지만, 컴퓨터는 CPU를 사용해 연산하고, 메모리를 사용해 데이터를 기억한다.
- 메모리
메모리는 데이터를 저장할 수 있는 메모리 셀의 집합체이다.
셀 하나의 크기는 1바이트(8비트)이며, 컴퓨터는 1바이트 단위로 데이터를 저장하고 읽어들인다.
각 셀을 고유의 메모리 주소를 갖는다. 메모리 주소는 공간의 위치를 나타내며, 0부터 시작해서 메모리 크기만큼 정수로 표현된다.
저장되는 데이터는 모두 2진수로 저장이 된다.
10 + 20의 예제의 숫자 값은 메모리 상의 임의의 위치에 저장되고, CPU는 이를 읽어들여 연산을 수행하고 30이라는 결과도 메모리상의 임의의 위치에 저장된다.
그렇다면 30이라는 값은 어떻게 써야할까?
메모리 주소에 직접 접근하는 방법은 올바른 방법이 아니기 때문에,
기억하고 싶은 값을 메모리에 저장하고, 저장된 값을 읽어들여 재사용하기 위해 변수라는 매커니즘을 제공한다.
따라서,
변수 : 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
상징적인 이름인 변수는 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 값이 저장된 메모리 공간의 주소(예. 0x0669F913)로 치환되어 실행된다.
따라서 개발자는 직접 메모리 주소를 통해 값을 참조할 필요가 없고 변수를 통해 안전하게 값에 접근할 수 있다.
변수 이름을 등록하고 값을 저장할 메모리 공간을 확보하는것이 변수 선언이고,
변수에 값을 저장하는 것을 할당(assignment)라고 하고,
변수에 저장된 값을 읽어 들이는 것을 참조(reference)라고 한다!
-> 사람이 이해할수 있는 언어로 변수명을 짓고, 변수명을 사용해 참조를 요청하면 자바스크립트 엔진은 변수 이름과 매핑된 메모리 주소를 통해 메모리 공간에 접근해서 저장된 값을 반환한다.
식별자 : 어떤 값을 구별해서 식별할 수 있는 고유한 이름
프로그래밍에서 식별자는 값이 아니라 메모리 주소를 기억하고 있다.
식별자는 변수, 함수, 클래스 등의 메모리 상에 존재하는 어떤 값을 식별할 수 있는 이름을 모두 의미한다.
*변수를 선언한 이후, 변수에 값을 할당하지 않았을때 메모리 공간은 비어 있을 것으로 생각할 수 있으나 확보된 메모리 공간에는 자바스크립트 엔진에 의해 undefined라는 값이 암묵적으로 할당되어 초기화된다. 선언 - 초기화의 사이의 개념에서 호이스팅, TDZ, var, let, const의 개념들이 중요시하게 구분되니 확실히 알아두자!
변수 초기화란
변수가 선언된 이후 최초로 할당하는 것을 말한다. 따라서 var는 변수 선언시 undefined로 암묵적인 초기화가 자동 수행된다. 초기화를 거치지 않으면 확보된 메모리 공간에는 이전의 다른 애플리케이션이 사용한 쓰레기 값이 남아있을수 있기 때문에, 자바스크립트의 var 키워드는 암묵적으로 초기화를 수행하니 해당 위험으로부터는 안전하다고 할 수있다.
자바스크립트 엔진은 변수 선언이 소스코드의 어디에 있든 상관없이 다른 코드보다 먼저 실행한다. ( 소스코드 평가 과정 또한 추가로 공부하자) 이를 호이스팅이라고 부르는것이다.
변수 선언은 소스코드가 순차적으로 실행되는 시점인 런타임 이전에 먼저 실행되지만, 값의 할당은 소스코드가 순차적으로 실행되는 시점인 런타임에 실행된다.
값의 재할당이란
현재 변수에 저장된 값을 버리고 새로운 값을 저장하는것이다. ( 만약 값을 재할당할 수 없다면 변수가 아니라 상수라고 한다 )
값을 재할당하면 이전 값은 변동이 없고, 새로운 메모리 공간을 확보하고 그 메모리 공간에 새로운 값을 저장한다.
더 이상 사용되지 않는 값은 가비지 콜렉터에 의해 메모리에서 자동 해제된다.
** 가비지 콜렉터 : 애플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제하는 기능을 말한다. 즉 어떠한 식별자도 참조하지 않는 메모리 공간을 의미한다. 자바스크립트는 가비지 콜렉터를 내장하고 있는 매니지드 언어로서 가비지 콜렉터를 통해 메모리 누수를 방지한다.
언매니지드언어 vs 매니지드언어 :
C 언어 같은 언매니지드 언어는 개발자가 명시적으로 메모리를 할당하고 해제하기 위해 저수준 메모리 제어 기능을 제공한다. 개발자의 역량에 따라 최적화의 성능을 활보할 수 있지만 치명적 오류를 생산할 가능성도 있다.
자바스크립트는 매니지드 언어로서 메모리 관리 기능을 개발자의 직접적인 메모리 제어로서 하지 않는다. 더이상 사용하지 않는 메모리는 가비지 콜렉터가 수행하며, 일정한 생산성을 확보할 수 있지만 어느 정도의 손실은 감수할 수밖에 없다.