데이터 타입은 프로그래밍 언어에서 사용할 수 있는 데이터 (숫자, 문자열, 불리언 등)의 종류를 말한다.
데이터 타입에는 기본형과 참조형이 나뉘고 각각의 차이점을 알아보도록 하겠다.
값을 그대로 할당한다.
기본형 데이터 타입의 종류
Number
String
Bollean
null
undefined
(ES6) symbol
프로그래밍 언어에서의 숫자는 우리가 일반적으로 알고 있는 숫자와 그 성격이 사실상 동일하다.
우리는 숫자를 이용하여 덧셈(+)/뺄셈(-)/곱셈(*)/나눗셈(/) 등의 연산을 할 수 있다.
String 타입은 텍슽느 데이터를 나타내는데 사용한다.
Boolean타입의 값은 논리적 참, 거짓을 나타내는 true
와 false
뿐이다.
null
은 의도적으로 변수에 값이 없다는 것을 명시할 때 사용한다.
Javascript는 대소문자를 구별하므로 null은 Null, NULL 등과 다르다.
선언 이후 값을 할당하지 않은 변수는 undefined 값을 가진다.
어떤 변수를 만들고 그 값을 정의해주지 않았을때나 존재하지 않는 객체 프로퍼티에 접근할 경우 undefined가 반환된다.
심볼은 ES6에서 새롭게 추가된 타입으로 변경 불가능한 원시 타입의 값이다.
심볼은 주로 이름의 충돌 위험이 없는 유일한 객체의 Property Key를 만들기 위해 사용한다.
값이 저장된 주소값을 할당한다. (참조)
참조형 데이터 타입의 종류
[Object] Array
Function
RegExp
(ES6) Map
Set
WeakMap
WeakSet
메모리 상에 저장되는 형태를 추상화한다. (실제 메모리 동작의 흐름을 이해할 수 있다.)
변수명/주소의 표와 주소/데이터의 표는 별개의 저장공간이 아니며, 변수명/주소의 표가 313번보다 앞에 있다고 생각하자
var a;
a = 10;
var b = 'abc';
var c = b;
c = 20;
위 코드를 실제 컴퓨터에서는 어떻게 처리 하는지 표로 알아보자
변수명 | a | b | c | |
---|---|---|---|---|
주소 | @313 | @314 | @315 |
주소 | ... | 313 | 314 | 315 | 316 | 317 | ... |
---|---|---|---|---|---|---|---|
데이터 | 길없음 => 10 | 'abc' | 'abc' => 20 |
선언: 공간을 확보하고 해당 공간의 주소를 변수명과 매칭한다.
할당: 해당 변수가 가리키는 주소의 공간에 데이터를 저장한다.
var obj = {};
obj.a = '';
obj.b = '';
obj.a = 1;
obj.b = 'b';
var obj2 = obj;
obj2.a = 10;
console.log(obj2.a); // 10
console.log(obj.a); // 10
// obj === obj2: 서로 동일한 객체의 주소(1011)를 참조한다.
변수명 | obj | obj2 | ||
---|---|---|---|---|
주소 | @413 | @414 |
주소 | ... | 413 | 414 | ... | 1011 | 1012 | 1013 | ... |
---|---|---|---|---|---|---|---|---|
데이터 | 길없음 => | @1011 | { a: @1012, b: @1013 } | 값없음 => 1 => 10 | 값없음 => 'b' |
위 과정을 데이터 공간에 기본형 데이터가 담길 때까지 반복한다.
즉 참조형 데이터는 기본형 데이터의 집합이다.
참조가 이뤄지는 형식: 따로 저장된 객체의 주소(1011)만 복사한다.
property: 프로퍼티명은 변수와 비슷한 성질
value: 변수에 할당되는 data와 비슷한 성질
Nested Object는 참조형 데이터 안에 또 다시 참조형 데이터가 있는 경우를 말한다.
var ojb3 = {};
obj3.a = '';
obj3.a = [];
obj3.a = [4, 5, 6];
obj3.a = 'new';
// 1326~1328 주소의 데이털르 참조하는 곳이 없어진다. Danling Object가 된다.
변수명 | obj3 | |||
---|---|---|---|---|
주소 | @547 |
주소 | ... | 547 | ... | 1184 | 1185 | ... | 1326 | 1327 | 1328 | ... |
---|---|---|---|---|---|---|---|---|---|---|
데이터 | 값없음 => @1184 | { a: @1185 } | { @1326, @1327 => 'new', @1328 } | 값없음 => 4 => G.C 대상 | 값없음 => 5 => G.C 대상 | 값없음 => 6 => G.C 대상 |
Daning Object: '정리되지 않은 메모리', '유효하지 않은 메모리 주소'를 말한다.
G.C 과정(Mark and Sweep): 스택의 모든 변수 또는 Reachable 객체를 스캔하면서 각각 어떤 객체를 참조하고 있는지 찾는 과정을 Mark라고 한다.
이 과정에서 Stop the world가 발생한다.
이후 Mark되어 있지 않은 객체들을 합에서 제거하는 과정이 Sweep이다.