Javascript의 데이터 타입은 크게 두가지로 나뉜다 : 기본형, 참조형
- 기본형 : Number, String, Boolean, null, undefined, Symbol
- 참조형 : object(Map, Set), array, function, date, RegExp…
원시타입의 값은 변경 불가능한 값 (immutable value)이다.
다시 말해 한 번 생성된 원시 값은 읽기 전용 (read-only)이며 call by value(값에 의한 전달)이다.
- 변수 : 값을 저장하기 위해 확보한 메모리 공간 자체로 식별자의 한 형태
- 식별자 : 어떤 데이터를 식별하는데 사용하는 이름(=변수명)
- 값 : 변수에 저장된 데이터
let a; // a라는 변수를 선언 후 식별자를 a로 한다.
a = 10; // 변수 a에 10을 할당한다.
1) 변수를 저장하기 위한 빈 메모리공간(@1001)을 확보한다.
2) 이 변수의 식별자를 ‘a’로 한다.
3) 저장할 데이터인 10이 데이터 영역에 있는지 탐색한다. 10이 저장되어 있지 않다면 비어있는 데이터 영역의 빈 공간(@5014)에 10을 저장한다
4) 변수 영역에서 식별자 ‘a’를 검색한다.(@1001)
5) 10을 저장한 데이터 영역의 주소(@5014)를 변수 a(@1001)의 값에 저장한다.
✅ 그렇다면 왜 변수 영역에 직접 데이터를 저장하지 않을까..?
-> 데이터 변환을 자유롭게 할 수 있다.
-> 메모리를 효과적으로 관리 할 수 있다.
✅ 재할당한다면?
let a = 10;
a = 20; // 재할당
가비지 컬렉터(Garbage Collector)
- 사용되지 않는 메모리를 자동으로 탐지해 해제하여 사용 가능한 메모리를 유지하는 역할
- 애플리케이션의 성능과 메모리 관리를 효과적으로 지원해준다.
✅ 변수 b에 변수 a를 할당해보자.
let a = 2;
let b = a;
a = 5;
1) 하나의 변수 공간을 확보한 후 이름을 b로 지정한다.
2) b는 a와 같은 값을 가리킨다.
3) 변수 a에 값 5를 할당하면 a가 가리키는 주소값만 변경된다.
- 객체(Object)라고도 불리며 객체, 배열, 함수 등이 포함됩니다.
- Mutable 변경 가능한 값이다.
- 해당 값에 대한 참조를 저장하고 변수는 실제 값을 직접 저장하는 것이 아닌 저장된 주소를 참조한다. (Call by Reference)
- 따라서 참조 타입 변수 간에 값을 할당하면 주소가 복사되어 동일한 객체를 가리킵니다.
let obj1 = {
name : '수진',
like : '피자',
}
1) 먼저 변수 obj1를 저장할 빈 메모리 공간(@1001)을 할당하고 식별자로 obj1을 저장한다.
2) 이 프로퍼티로 이루어진 집합을 저장하기 위해 별도의 변수영역(@7001)을 확보하고 그 변수 영역의 주소(@7001~) 을 데이터 영역의 임의의 공간 @5014)에 저장한다.
3) 프로퍼티를 저장할 변수 영역의 주소(@7001~)을 담고 있는 데이터 영역의 주소(@5014)를 식별자가 obj1인 변수(@1001)의 값에 저장한다.
4) @5014의 변수영역에 확보된 변수영역(@7001, @7002)에 각각 식별자로 name, like를 저장한다.
5) 식별자가 a인 프로퍼티(@7001)에 할당할 데이터인 ‘수진’이 데이터 영역에 있는지 탐색한다.
없다면 데이터 영역의 임의의 공간 @5016에 ‘수진’을 저장하고 ‘수진을 저장한 메모리주소(@5016)를 식별자가 a인 프로퍼티(@7001)의 값에 저장한다.
6) 식별자 like인 프로퍼티(@7002)에 할당할 데이터 ‘피자’가 데이터 영역에 있는지 탐색한다.
없다면 데이터 영역의 임의의 공간 @5017에 ‘피자’을 저장하고 ‘피자’를 저장한 메모리주소(@5017)를 식별자가 like인 프로퍼티(@7002)의 값에 저장한다.
원시타입 데이터는 데이터 영역에 실제 값이 저장되고 참조타입 데이터는 데이터 영역에 값이 저장된 메모리 주소를 저장한다.
변수, 데이터 영역 => Stack 메모리에 저장
참조값 영역 => Heap 메모리에 저장
원시타입의 데이터는 변수에 직접 값이 저장됩니다.
함수에 원시타입 데이터를 인자로 전달할 때, 값이 복사되어 함수 내부로 전달됩니다.
따라서 함수 내부에서 인자의 값이 변경되어도 원본 값은 변하지 않습니다.
실제로는 Call by Sharing이라고도 하는데, 값이 아니라 값이 저장된 메모리의 주소가 전달되기 때문입니다.
참조타입의 데이터는 변수에 해당 데이터의 주소가 저장됩니다.
함수에 참조타입 데이터를 인자로 전달할 때, 주소가 복사되어 함수 내부로 전달됩니다.
따라서 함수 내부에서 인자의 값이 변경되면 원본 데이터도 함께 변경됩니다.