데이터 타입
자바스크립터의 데이터 타입은 총 8가지이다.
Boolean : true 혹은 false 자료형
null : 어떤 값이 의도적으로 비어있음을 표현하는 자료형, 객체
var tNull = null; // console.log(typeof a); // object
undefined : 값을 명시적으로 않으면 undefined 자료형.
var tUndefined; // console.log(typeof a); // undefined
Number : 정수 또는 소수점 자료형.
BigInt : Number보다 큰 정수를 표현할 수 있는 자료형.
var tBigInt1 = 9007199254740991n; var tBigInt2 = BigInt(9007199254740991); var tBigInt3 = BigInt("0x1fffffffffffff");
String : 문자, 문자열을 나타내는 자료형.
Symbol : 모든 값이 고유한 자료형.
var tSymbol = Symbol(111); console.log(a === 111); // false; console.log(Symbol("String") === Symbol("String")); // false
Object : 데이터와 함수의 집합.
var tObject = { number : 1, string : "string", boolean : false, null : null }
이렇게 8가지의 데이터들은 크게 원시 타입(Primitive Type)과 *참조 타입(Reference Type) *두 가지로 나뉘는데
1번부터 7번까지의 데이터들은 원시 타입이고 8번인 object만 참조 타입이다
원시 타입과 참조 타입의 큰 차이점은 데이터 값의 할당 방식인데
이 두 타입들의 할당 방식이 어떻게 다른지 알아보도록 하자
원시 타입(Primitive Type)
우선 원시 타입은 변수에 데이터 값을 그대로 할당한다
var primitive;
위와 같이 primitive를 선언하면
변수 | primitve |
주소 | *1000 |
주소 | ... | 1000 | 1001 |
데이터 | ... | - |
변수 a에 (데이터 값이 비어있는)주소가 할당되고
primitive = 10;
로 primitive변수를 초기화 해주게 되면 비어있던 주소가 1000인 메모리에 10이 할당되어 primitive변수가 10의 값을 가지게 된다
주소 | ... | 1000 | 1001 |
데이터 | ... | 10 | - |
참조 타입(Reference Type)
참조 타입은 데이터 값을 바로 할당하는 게 아니라 데이터가 담겨있는 주소를 할당한다
var refer1 = {
data1:10,
data2:100,
data3:1000,
}
refer1 객체를 선언하고 초기화하면
변수 | refer1 |
주소 | *1001 |
refer1에게 주소가 하나 할당되고
아까 원시 타입 처럼 주소에 찾아가서 데이터를 넣으려고 봤는데
data1,2,3으로 데이터가 3개나 된다.. 한 주소에 넣을 수 있는 데이터 크기는 정해져있기 때문에 다 넣을 수는 없기 때문에
주소 하나에 값을 하나씩 넣어줘야하는데 이때 3개의 데이터를 할당시킬 3개의 주소가 필요하고
3개의 주소를 가르킬 주소가 또 필요하다..
주소 | ... | 1001 | 1002 | 1003 | ... | 2000 | 2001 | 2002 | 2003 |
데이터 | ... | - | aa | - | - | - |
여기에 데이터를 넣고
주소 | ... | 1001 | 1002 | 1003 | ... | 2000 | 2001 | 2002 | 2003 |
데이터 | ... | - | { data1 : *2001 data2: *2002 data3: *2003 } | 10 | 100 | 1000 |
데이터들의 주소값을 가지고 있는 주소를 refer1의 주소가 가르키게 하면
주소 | ... | 1001 | 1002 | 1003 | ... | 2000 | 2001 | 2002 | 2003 |
데이터 | ... | *2000 | { data1 : *2001 data2: *2002 data3: *2003 } | 10 | 100 | 1000 |
와 같은 형태가 된다
이 상태에서
var refer2 = refer1;
refer2를 초기화 하고 refer1으로 초기화 하면 위의 과정을 되풀이할까?
아니다.
매우 대충 만든 메모리 그래프로 표현하자면
변수 | refer1 | refer2 |
주소 | *1001 | *1002 |
우선 refer2가 초기화 되었으니 refer2가 주소값을 할당받게 되고
주소 | ... | 1001 | 1002 | 1003 | ... | 2000 | 2001 | 2002 | 2003 |
데이터 | ... | *2000 | *2000 | { data1 : *2001 data2: *2002 data3: *2003 } | 10 | 100 | 1000 |
refer2의 주소값은 refer1과 똑같이 2000을 가르키게 된다
refer1과 refer2가 똑같은 객체를 가르키고 있게 되는 것
그렇기 때문에
refer2.data2 = 0;
위의 명령문을 실행하게 된다면
주소 | ... | 1001 | 1002 | 1003 | ... | 2000 | 2001 | 2002 | 2003 |
데이터 | ... | *2000 | *2000 | { data1 : *2001 data2: *2002 data3: *2003 } | 10 | 0 | 1000 |
와같이 둘이 같이 참조하고 있는 주소값의 데이터가 똑같이 바뀌게 되어
console.log(refer1.data2 === refer2.data2); // true (0===0);
으로 같은 값이 나오는 것이다.
'JavaScript > 기초' 카테고리의 다른 글
호출 스택, 이벤트 루프 (0) | 2020.10.02 |
---|---|
생성자 함수 (0) | 2020.10.01 |
this binding (0) | 2020.09.30 |
실행 컨텍스트와 스코프 (0) | 2020.09.28 |
호이스팅 (0) | 2020.09.28 |