JavaScript에서의 데이터타입

JavaScript에서의 데이터타입

코어 자바스크립트(정재남 저) 책을 기본으로 하여 자바스크립트를 공부하면서 내용을 정리하고자 한다.


01 데이터타입



데이터 타입의 종류

* 기본형 (원시형) : number, string, boolean, null, undefined, symbol

* 참조형 : Object
          - array, function, Date, RegExp ...

기본형은 할당이나 연산시 복제되고 참조형은 참조된다. 그러나 사실은 둘다 복제되는 건 마찬가지.

기본형은 값이 담긴 주소값 바로 복제, 참조형은 값이 담긴 주소값들로 이루어진 묶음을 가리키는 주소값을 복제한다.

배경지식

메모리와 데이터

컴퓨터는 모든 데이터를 0 또는 1로 인식.

하나의 메모리 조각 -> 비트 (bit)
각 비트(bit)는 고유한 식별자(unique identifier)를 통해 위치를 확인한다.

but 비트 단위로 데이터 처리하는 것은 매우 비효율적.
그래서 나온 단위는 비트 8개를 묶은 단위 :: 바이트(byte)

1Byte = 8Bit :: 28 -> 256개 :: 표현 가능한 값의 수

자바스크립트는 숫자의 경우 정수형, 부동소수형 구분하지 않고 64비트, 즉 8바이트 사용가능.


식별자와 변수

변수(Variable) : 변할 수 있는 수 :: 컴퓨터 용어로 사용될 시 데이터를 담아 사용할 수 있는 공간 또는 그릇 으로 해석됨.

식별자(Identifier) : 어떤 데이터를 식별할 수 있는 이름, 즉 변수명을 일컬는다.


변수 선언, 데이터 할당

변수 선언

let a;

변수를 선언하면 컴퓨터는 어떻게 작동할까?

명령을 받은 컴퓨터는 메모리에서 비어있는 공간 하나를 확보(@1003)하여 공간의 이름을 a 라고 지정한다. (여기서 a는 식별자이다.)

값은 추후에 입력되겠죠? (만약 이 변수를 사용한다면)

지금의 상태는 undefined이다. 선언만 하고 값은 할당하지 않았기 때문이다.


변수할당

이후 사용자가 a에 접근한다면 컴퓨터는 메모리에서 a라는 식별자를 찾아 그 공간에 있는 값을 반환하게 된다.


데이터 할당

let name; // 변수 선언
name = "Harry"; // 변수 할당

let name = "Harry"; // 변수 선언과 동시에 할당

위에서 변수 name을 먼저 선언하고 그 후 name이란 변수에 ‘Harry’라는 데이터를 할당하였다.

그 밑에서는 name이라는 변수를 선언함과 동시에 ‘Harry’라는 데이터를 할당하였다. 이 두 가지 방법은 동일한 작업을 수행한다.


자, 그럼 어떻게 작동하는가?

컴퓨터에 name이라는 변수를 선언해 주었으니 메모리에 공간을 마련하였을 것이고 그 공간에 'Harry'라는 데이터를 넣어주면 된다.

근데 실제로는 그 공간에 이 데이터를 바로 입력하지 않는다. 데이터를 저장하는 별도의 공간이 존재한다.


데이터할당

  1. 변수가 선언되면 컴퓨터는 변수 영역에 빈 공간을 확보한다. (@1003)
  2. 확보한 공간의 이름을 선언한 식별자로 명명한다.(name)
  3. 데이터 영역의 빈 공간에 'Harry'를 저장한다.(@5003)
  4. 변수 영역에서 name을 검색한다.
  5. 데이터를 저장한 주소(@5003)을 변수 영역의 공간(@1003)에 저장한다.


왜 직접 저장하지 않고 데이터 영역을 새로 만들어 저장할까?

 데이터 변환을 자유롭게 하기 위해서~
 메모리를 효율적으로 관리하기 위해서!

숫자형 데이터는 64비트의 공간을 확보하지만 문자열 데이터는 가변적이다. 영어는 1바이트, 한글은 2바이트 등 각각 메모리 용량이 다르게 필요하다.

확보한 공간에서만 데이터 변환이 가능하다면 변환 데이터를 다시 저장하기 위해 공간을 늘려야하는 작업을 해야만 한다. 만약 해당 데이터가 중간에 있다면 이 상황이 골치가 아파진다.

그 해당 공간보다 뒤에 있는 녀석들은 죄다 뒤로 보내야 하고, 이동시킨 주소를 각 식별자와 연결시켜줘야 한다. 컴퓨터가 무척 많은 연산을 해야 할 것이다. 그러기에 변수 영역과 데이터 영역을 나누어 저장하는 것이다.



자, 그럼 내가 선언한 name 이라는 변수에 값을 추가하면 어떻게 될까?

현재 할당된 값에다가 내용을 추가하면 추가한 내용만 합치면 될 것 같은데...

간단히 생각해보면 name 이라는 식별자에 할당된 값(@5003)의 내용을 바꾸면 되지 않을까 하겠지만 컴퓨터는 그렇게 작동하지 않는다. 새로이 값이 할당이 되면 그 값은 데이터 영역의 새로운 공간에 저장되고 저장된 데이터의 주소값으로 식별자의 값이 변경된다.

겉으로 보기엔 그냥 값을 추가한 것처럼 보이지만 내부적으로는 공간을 새로 만들고 저장된 후 그 변경된 주소값을 다시 저장하는 셈이다.


그럼, 부분 삭제를 해도?

마찬가지로 우리가 보기에는 부분적으로 삭제한 것처럼 보이지만 이것 역시 어찌되었던 간에 새로운 값이 입력되는 것이다. 새로 할당되는 모든 값은 새로운 공간(데이터 영역)에 저장된다. (단, 전제는 새로 입력되는 값이 데이터 영역에 없다는 것이다.)


데이터할당2


변수 name에 ‘Harry Potter’를 할당하든, ‘Ha’를 할당하든 데이터 영역에 같은 값이 없는 한 무조건 새로 공간을 만들어 저장된다.


그럼 다음의 경우는 어떠할까?

let Math = 90;
let Science = 90;
let Literature = 90;
let Music = 90;


자, 여기 각 과목에 대한 점수를 입력하는 변수가 있다고 치자. Math, Science, Literature, Music의 4과목이 있는데 공교롭게도 모든 과목의 점수가 다같은 90점이라면 각 과목의 값을 할당할때마다 데이터 영역에 공간을 다 만들어 주어야 할까?

위에서 변수를 처음 선언할 때 변수 영역에 변수의 공간을 생성하고 데이터 영역에 값에 대한 공간을 생성한다고 했다. 여기서는 처음 Math 변수를 선언할 시 데이터 영역에 90 이라는 데이터를 저장하는 공간이 처음 생성되었을 것이다. 그 공간의 주소값을 (@5003) Math 변수의 값으로 저장할 것이다.

그런 다음 두번째 변수(Science)가 선언될 시 변수 영역의 새로운 공간에 변수의 공간이 생성되는데 첫번째 변수인 Math의 데이터와 동일한 데이터를 참조하므로 데이터 영역에 이미 생성되어 있는 데이터 주소값(@5003)을 그대로 가져다 쓰면 되는 것이다.

변수를 만들때 데이터 영역에 공간을 생성하는 것은 동일한 데이터가 없을 때 가능한 것이다. 같은 데이터가 있는데도 또 다른 공간을 할애하는 것은 비효율적이기 때문이다.

데이터할당3



👉🏻 다음 장에서 이어서 설명 👉🏻 Next Page