Web Programming/Javascript

[프론트앤드 개발 더하기] Javascript 데이터 타입

FelixShin 2022. 2. 4. 07:33
반응형

1. 데이터타입

 Javascript의 Data Type(데이터타입)은 Primitive Type(기본형)과 Reference Type(참조형)으로 구분됨

 

 

1) Primititye Type

   :  string, number, bigint, boolean, null, undefined, symbol(es6에 추가)로 구분

   * null, undefined를 제외한 모든 기본값에는 기본값을 둘러싸는 객체가 있음

   * symbol은 es6에서 추가된 변경 불가능한 primitive 타입으로 이름 충돌 위험이 없는 유일한 값. 객체 property key를 만들기 위해 사용됨

 

2) Reference Type

   : Obejct 로 하위 에 Array, Function, RegExp, Set / WeakSet(es6에 추가), Map / WeakMap(es6에 추가)

 

Javascript의 메모리 구조는 Stack Memory, Heap Memory로 나뉘는데, Stack Memory에는 변수, 기본형 데이터가 정적할당이 되어지고, Heap Memory에는 참조형 데이터가 동적할당 됨.

 

 

2. 데이터 메모리에 할당

 

1) Primitive Type에 대한 할당

var a = 'ab'; 를 저장하면 이름 a를 갖는 새 주소값(예 1001)에 저장되어지고, 값인 'ab'는 새 주소값 (예 3001) 에 저장되어짐. 1001에 값은 @3001 이런식으로 참조하게 됨

 

2) Reference Type에 대한 할당

var obj = {

  x: 1,

  arr: [1,2]

}

위처럼 선언하면 var obj; obj ={ // }식으로 되는 것이라 다름없이 각각 이름과 값이 나눠서 할당된다.

x, arr 속성과 값 넣는 부분도 메모리에 값을 각각 할당하게 되어진다.

 

obj.arr= 'test' 식으로 값을 넣게 되면 기존에 값들이 메모리 재할당 되어지고, 만약 참조하고 있는 값이 없어지면 GC(Garbage Collector)가 값을 정리함 (참조카운트가 0이 됨 : 참조하는 대상이 없어짐)

 

3) 값 참조방식에 대한 고찰

값이 같으면 key(속성) 마다 다르게 참조를 하지않고, 같은 주소를 참조하는게 유리

var obj = {

  x: '값 엄청 길음',

  arr: ['값 엄청 길음', 3]

}

>> 위 같은 경우에 값이 엄청 길면 각각 다른 주소에 메모리를 저장하는게 낭비 되기 때문에 지금의 구조처럼 값을 같은 메모리 주소 공간에 저장하는 것이 유리할 수 있음.

 

(1) 값을 직접 저장하는 방식 : 데이터 할당시에는 빠름, 비교에 비용이 많이 듦, 메모리 낭비가 심함

 

(2) 값의 주소를 저장하는 방식 : 데이터 할당시에는 느림, 비교에 비용이 들지 않음, 메모리 낭비 최소화 >> 그래서 이 방식을 취함 >> 같은 값이 오직 하나만 존재!

 

(3) 참조형 일 경우 값을 바꿀 때 원본 값이 바뀌어질 수 있음 >> 필요에 따라 매번 불변 객체를 만들 수 있음

 

Reference)

https://developer.mozilla.org/en-US/docs/Glossary/Primitive

https://url.kr/e7w8nt (인프런 정재남님 코어자바스크립트)