자바스크립트의 데이터 타입에는 크게 두 가지가 있다. 바로 기본형과 참조형이다.
일반적으로 기본형은 할당이나 연산시 복제되고 참조형은 참조된다고 알려져 있다. 자세히 말하자면 둘 모두 복제를 하긴 한다. 하지만 기본형은 값이 담긴 주솟값을 바로 복제하는 반면 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다는 점이 다르다.
var a;
위 코드를 말로 하자면 "변할 수 있는 데이터를 만든다. 이 데이터의 식별자는 a로 한다."이다. 변수란 변경 가능한 데이터가 담길 수 있는 공간 또는 그릇이라고 생각할 수 있겠다.
위 코드를 명령 받은 컴퓨터는 메모리에서 비어있는 공간 하나를 확보한다.
이 공간의 이름(식별자)을 a라고 지정한다. 여기까지가 변수 선언 과정이다.
이후에 사용자가 a에 접근하고자 하면 컴퓨터는 메모리에서 a라는 이름을 가진 주소를 검색해 해당 공간에 담긴 데이터를 반환할 것이다.
var a; // 변수 a 선언
a = 'abc'; // 변수 a에 데이터 할당
var a = 'abc'; // 변수 선언과 할당을 한 문장으로 표현
맞춤법 검사를 원하는 단어나 문장을 입력해 주세요. a라는 이름을 가진 주소를 검색해서 그곳에 문자열 'abc'를 할당하면 될 것 같다.
그런데 실제로 해당 위치에 문자열 'abc'를 직접 저장하지는 않는다. 데이터를 저장하기 위한 별도의 메모리 공간을 다시 확보해서 문자열 'abc'를 저장하고, 그 주소를 변수 영역에 저장하는 식으로 이뤄진다.
왜 변수 영역에 값을 직접 대입하지 않고 굳이 번거롭게 한 단계를 더 거치는 이유는 데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리를 더욱 효율적으로 관리하기 위한 것이다.
문자열 'abc'의 마지막에 'd'를 추가,제거 하라고 해도 결과의 문자열을 새로 만들어 별도의 공간에 저장한다.
변수와 상수를 구분하는 성질은 '변경 가능성'이다. 바꿀 수 있으면 변수, 바꿀 수 없다면 상수이다. 하지만 상수와 불변 값과 같은 개념으로 생각할 수 있는데 다른 개념이다. 변수와 상수를 구분 짓는 변경 가능성의 대상은 변수 영역 메모리이다. 반면 불변성 여부를 구분할 때의 변경 가능성은 데이터영역 메모리이다.
var a = 'abc';
a = a + 'def';
var b = 5;
var c = 5;
b = 7;
변수 a에 문자열 'abc'를 할당했다가 뒤에 'def'를 추가하면 기존의 'abc'가 'abcdef'로 바뀌는 것이 아니라 새로운 문자열 'abcdef'를 만들어 그 주소를 변수 a에 저장한다. 'abc'와'abcdef'는 완전히 별개의 데이터이다.
변수 b에 숫자 5를 할당한다. 그러면 컴퓨터는 일단 데이터 영역에서 5를 찾고, 없으면 데이터 공간을 하나 만들어 저장한다. 그 주소를 b에 저장한다. 다시 같은 수인 5를 할당하려고 할 때 컴퓨터는 데이터 영역에서 5를 찾는다. 이미 만들어놓은 값이 있으니 그 주소를 재활용한다.
이처럼 문자열 값도 한 번 만든 값을 바꿀 수 없고, 숫자 값도 다른 값으로 변경할 수 없습니다. 변경은 새로 만드는 동작은 통해서만 이뤄진다. 이것이 바로 불변 값의 성질이다. 한 번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다.
var obj1 = {
a: 1,
b: 'bbb'
};
기본형 데이터와의 차이는 '객체의 변수(프로퍼티) 영역'이 별도로 존재한다는 점이다. 객체가 별도로 할애한 영역은 변수 영역일 뿐 '데이터 영역'은 기존의 메모리 공간을 그대로 활용하고 있다. 데이터 영역에 저장된 값은 모두 불변 값이다. 그러나 변수에는 다른 값을 얼마든지 대입할 수 있다. 바로 이 부분 때문에 흔히 참조형 데이터는 불변하지 않다고 한다.