모던 자바스크립트 Deep Dive의 Chapter04 변수를 읽고 필요한 내용만 정리한 포스트입니다.
메모리란 데이터를 저장할 수 있는 메모리셀의 집합체입니다.
컴퓨터는 1Byte
단위로 데이터를 읽으며, 각 메모리는 고유의 주소를 갖습니다.
또한 메모리에는 2진수 형태의 데이터만 저장이 됩니다. ( 숫자, 문자, 이미지, 영상 등 )
변수란 하나의 값을 저장하기 위해 확보한 메모리 공간 or 메모리 공간을 식별하기 위해 붙인 이름을 의미합니다.
즉, 변수에 값이 들어가 있는 것이 아닌 변수는 특정 메모리 공간을 가리키고 그 메모리 공간에 값이 들어있는 형태입니다.
메모리에 값이 저장되는데 메모리에 직접적으로 접근하지 않고 변수를 거쳐서 접근하는 이유는 개발자가 잘못된 메모리 주소를 임의로 건드릴 수 있기 때문입니다.
따라서메모리 -> 값
순서가 아닌변수 -> 메모리 -> 값
순서로 접근합니다.
변수명은 메모리 공간에 저장된 값을 식별할 수 있는 고유의 이름을 의미합니다.
변수값은 변수가 가지는 메모리 공간의 값을 의미합니다.
식별자란 어떤 값을 구별해서 식별할 수 있는 고유의 이름입니다.
변수, 함수, 클래스 등이 식별자가 될 수 있습니다.
선언이란 값을 저장하기 위한 메모리 공간을 확보하고 변수 이름과 확보한 메모리 공간을 연결해서 값을 저장할 수 있게 준비하는 것을 말합니다.
var
, let
, const
를 이용해서 변수를 선언할 수 있습니다.
변수 선언 단계는 선언 단계와 초기화 단계로 나뉘어 있습니다.
선언 단계에서는 JavaScript 엔진
에게 변수를 알리는 단계입니다.
초기화 단계는 변수의 초깃값을 정하는 단계입니다.
var
의 경우에는 변수 선언과 초기화가 동시에 이뤄지며, undefined
로 초기화됩니다.
소스 코드를 실행하면 소스 코드 평가를 거친 이후에 런타임을 하게 됩니다.
소스 코드 평가 단계에서는 실행 컨텍스트 생성, 선언문 실행, 스코프 등록 등을 처리합니다.
런타임이란 소스 코드가 실행되는 시점을 말합니다.
Node.js
가 JavaScript
의 런타임이라고 하는 이유가 Node.js
가 JavaScript
를 실행시켜주기 때문입니다.
호이스팅이란 변수 선언문이 코드의 선두로 끌어올려진 것처럼 동작하는 특징을 말합니다.
실제로 선언문이 코드의 선두로 끌어올려진 것은 아니고 선언문이 소스 코드 평가 단계에서 실행되기 때문에 즉, 런타임 시점 이전에 실행되기 때문에 소스 코드상에서 선언문이 먼저 실행되게 됩니다.
// 런타임에 실행되기 때문에 선언과 초기화 단계가 이미 실행된 이후라서 "undefined"의 값을 가집니다.
console.log(name); // undefined
// 아래처럼 분리되어 실행됩니다.
var name = "john";
/**
* 소스 코드 실행 단계에서 실행되며, 변수 등록과 변수 초기화가 동시에 실행됩니다.
* var name;
* 런타임에 실행됩니다.
* name = "john";
*/
// 런타임에 name = "john";이 실행돼서 "john"의 값을 가집니다.
console.log(name); // "john"
변수란 별거 아닌 것처럼 보일 수 있지만, 평소에 아무렇지도 않게 변수, 메모리, 식별자 같은 단어를 사용했지만 사실 정확한 의미를 알지 못한 채 사용했다는 것을 알게 되었습니다.
하루에 한챕터씩 읽어나가면서 정리합니다...