자바스크립트의 뼈대가 되는 원시 타입(Primitive Type)과 참조 타입(Reference Type)에 대해 정리해보고자 한다.
원시 타입과 참조 타입
자바스크립트는 원시 타입(Primitive Type)과 참조 타입(ReferenceType)이라는 두가지 자료형을 제공한다.
원시 타입은 숫자(Number), 불린(Boolean), null, undefined, 문자열(String) 5가지가 존재한다.
참조 타입은 객체(Object), 배열(Array), 함수(function)가 있다.
원시 타입 데이터는 변수에 할당될 때 메모리 상에 고정된 크기로 저장되고 해당 변수가 원시 데이터의 값을 보관한다. 원시 타입 자료형은 모두 변수 선언, 초기화, 할당시 값이 저장된 메모리 영역에 직접적으로 접근한다, 즉 변수에 새 값이 할당 될 때 변수에 할당된 메모리 블럭에 저장된 값을 바로 변경한다는 뜻이다. Access By Value
참조 타입 데이터는 크기가 정해져 있지 않고 변수에 할당될 때 값이 직접 해당 변수에 저장될 수 없으며, 변수에는 데이터에 대한 참조만 저장된다. 변수의 값이 저장된 힙(Heap) 메모리의 주소값을 저장한다. 참조 타입은 변수의 값이 저장된 메모리 블럭의 주소를 가지고 있고, 자바스크립트 엔진이 변수가 가지고 있는 메모리 주소를 이용해서 변수의 값에 접근한다 Access By Reference
원시 타입 변수 복사
각 변수 간에 원시 타입 데이터를 복사할 경우 데이터의 값이 복사된다.
var x = 100;
var y = x;
x = 99;
y; // 100;
참조 타입 변수 복사
각 변수 간에 참조 타입 데이터를 복사할 경우 데이터의 참조가 복사된다.
var x = {count: 100}; // 참조 타입 선언
var y = x;
x.count = 99;
y.count; // 99, 'x'와 'y'는 동일한 참조를 담고 있으며, 따라서 동일한 객체를 가리킴
문자열 변수 복사
문자열은 크기가 고저오대 있지 않지만 원시 타입처럼 동작한다.
var x = "Hello";
var y = x;
x = "Hi";
x; // Hi
y; // Hello
위의 예제들처럼 Primitive Data는 Value를 넘겨주고, Object는 Reference, 메모리 주소를 넘겨주게 된다. 그렇기 때문에 아래의 코드와 같은 결과가 나오게 된다.
function test(a, b){
a = 44;
b.name = "name changed to c";
}
var a = 33;
var b = {
name : "test object"
};
test(a, b);
console.log(a); // 33, Access By Value
console.log(b); // { name: 'name changed to c' }, Access By Reference
[참고]