자바스크립트의 핵심 개념과 동작 원리를 이해하기 코어 자바스크립트를 읽고 학습한 내용을 정리합니다.
var a;
예제를 말로 풀어쓰면 "변할 수 있는 데이터를 만든다. 이 데이터의 식별자는 a로 한다." 가 된다.
변할 수 있는 데이터이기 때문에 선언할 때는 undefined 이더라도 나중에 다른 값으로 바꾸면 된다.
결국 변수란 변경 가능한 데이터가 담길 수 있는 공간 또는 그릇 이라고 말할 수 있다.
그리고 이 공간에 숫자를 담았다가 문자열을 담는 등의 다양한 명령을 내릴 수 있다.
var a; // 변수 a 선언
a = 'abc'; // 변수 a 에 데이터 할당
var a = 'abc'; // 변수 선언과 동시에 데이터 할당
이어서 할당 과정이다. a 라는 이름을 가진 주소를 검색해서 그곳에 문자열 'abc' 를 할당하면 될 것 같다.
그런데 실제로는 해당 위치에 문자열 'abc' 를 직접 저장하지 않는다. 데이터를 저장하기 위한 별도의 메모리 공간을 다시 확보해서
문자열 'abc' 를 저장하고, 그 주소를 변수 영역에 저장하는 식으로 이루어진다.
다음 순서에 따라 데이터 할당이 진행된다.
1. 변수 영역에서 빈 공간을 확보
2. 확보한 공간의 식별자를 a 로 지정
3. 데이터 영역의 빈 공간에 문자열 'abc' wjwkd
4. 변수 영역에서 a 라는 식별자를 검색
5. 앞서 저장한 문자열의 주소를 변수 영역 공간에 대입
변수 영역에 값을 직접 대입하지 않고 굳이 번거롭게 한 단계를 더 거치는 이유는
데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리를 더욱 효율적으로 관리하기 위함이다.
변수 variable 와 상수 constant 를 구분하는 성질은 '변경 가능성'이다. 바꿀 수 있으면 변수, 바꿀 수 없으면 상수.
불변값과 상수를 같은 개념으로 오해하기 쉬운데,
변수와 상수를 구부 짓는 변경 가능성의 대상은 변수 영역 메모리이다.
한번 데이터 할당이 이뤄진 변수 공간에 다른 데이터를 재할당할 수 있는지 여부가 관건이다.
반면 불변성 여부를 구분할 때의 변경 가능성의 대상은 데이터 영역 메모리이다.
기본형 데이터인 숫자, 문자열 boolean, null, undefined, Sybol 은 모두 불변값이다.
참조형 데이터를 변수에 할ㄷ랑하는 과정을 확인해 보자
var obj1 = {
a: 1,
b: 'bbb'
};
기본형 데이터와 차이는 '객체의 변수(프로퍼티) 영역'이 별도로 존재한다는 점이다.
다음 순서에 따라 데이터 할당이 진행된다.
1. 컴퓨터는 우선 변수 영역의 빈 공간을 확보하고, 그 주소의 이름을 obj1로 지정
2. 임의의 데이터 저장 공간에 데이터를 저장하려고 보니 여러 개의 프로퍼티로 이뤄진 데이터 그룹이기 때문에 이 그룹 내부의 프로퍼티들을 저장하기 위해 별도의 객체 변수 영역을 마련하고 그 영역의 주소를 데이터 영역에 저장한다.
3. 객체 변수 영역에 각각 a, b 라는 프로퍼티 이름을 지정한다.
4. 데이터 영역에서 1을 검색하고 검색 결과가 없으므로 임의의 새로운 데이터 영역에 저장하고 이 주소를 객체 변수 영역에 저장한다. 'bbb'문자열도 마찬가지이다.
데이터 영역에 저장된 값은 모두 불변값이다 그러나 변수에는 다른 값을 얼마든지 대입할 수 있다. 바로 이 부분 때문에 흔히 참조형 데이터는 불변하지 않다(가변값이다)라고 하는 것이다.
var obj1 = {
a: 1,
b: 'bbb'
};
obj1.a = 2;
이 경우 obj1 의 a 프로퍼티에 숫자 2를 할당하려고 한다.
데이터 영역에서 숫자 2를 검색하고 검색 결과가 없으므로 빈 데이터 영역 공간에 저장하고 이 주소를 식별자가 a 인 객체 변수 영역에 저장한다.
새로운 객체가 만들어진 것이 아니라 기존의 객체 내부의 값만 바뀐 것이다.