TIL 23 JavaScript - 데이터

Leo·2021년 5월 9일
0

Javascript

목록 보기
9/17
post-thumbnail

자바스크립트 데이터 타입

자바스크립트는 크게 기본형과 참조형 타입의 데이터들이 있다.

기본형

  • 숫자형(Number)
  • 문자형(String)
  • 불리언(Boolean)
  • Null
  • undefined
  • symbol(ES6 부터 추가 됨)

숫자형은 말 그대로 숫자형이다. 다른 정적 언어에서는 int, short, float 처럼 숫자형에도 많은 종류가 있다. 하지만 자바스크립트에서는 숫자형이 Number 하나이다. 그리고 숫자형에 따라 크기가 다르지만 자바스크립트에서 Number는 모두 64bit이다.

문자형도 다른 언어에서는 char와 같이 문자형이 따로 있다. 하지만 자바스크립트에서는 문자와 문자열을 나누지 않고 모두 string형으로 통일되어있다.

boolean은 말 그대로 ture 또는 false 값을 갖는다

null은 아무것도 없는 값이다. 아무것도 없다고 해서 타입도 아무것도 없는 것이 아니라 사실 null도 객체이다. typeof null 을 콘솔에 찍어보면 object로 나온다. MDN에서는 하위호환을 위해서 null이 아니라 객체라고 설명한다.

undefined는 말 그대로 정의되지 않은 값이다. 하지만 주의해야 할 것이 자바스크립트 엔진 자체에서 반환해주는 undefined는 값이 없는 것이지만, 사용자가 직접적으로 변수로 undefined를 지정하면 그 자체로 값이 된다.

이게 무슨 말이냐면 undefined가 그 자체로 값이 되지 않게 하려면 둘 중 하나를 절대로 쓰지 않으면 된다.

즉, 사용자가 임의로 undefined를 지정하지 않으면 모든 undefined는 자바스크립트 엔진이 반환해주는 값이기 때문에 비어있는 값이다.

그러므로 undefined를 변수로 사용하는 것을 지양해야 한다.

참조형

  • 객체(Object)
  • 배열(Array)
  • 함수(Function)
  • 날짜(Date)
  • 정규표현식(RegExp)

참조? 복제?

기본형은 할당이나 연산시 복제를 하고, 참조형은 할당이나 연산시 참조를 한다고 알려져 있다. 하지만 사실 둘 모두 복제를 하는 것이고 기본형은 값이 담긴 주소값을 바로 복제하지만 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가르키는 주솟값을 복제한다는 점이 다르다.

변수 vs 식별자

변수와 식별자를 혼용하여 사용하는 경우가 많지만 정확하게 변수와 식별자가 무엇인지 알고 사용하자

변수는 변할 수 있는 무엇인가를 뜻한다. 숫자, 문자열, 등등의 데이터를 뜻한다.
식별자는 어떤 데이터를 식별하는데 사용하는 이름 즉, 변수명이다.

데이터 할당

실제로 우리가 변수에 값을 할당하면 어떻게 내부적으로 데이터가 할당되는지 알아보자(1000번, 5000번은 예시이다.)

변수영역1001100210031004
---이름 : a 값 : @5003-

데이터영역5001500250035004
---'abc'-

식별자 a에 'abc'라는 변수를 할당하려고 한다. 그런데 변수 영역에 바로 값을 할당하지 않고 5000번대의 데이터 영역에 'abc'라는 값을 따로 할당하고 그 주소를 그대로 복제했다.

이번에는 'abc'에서 'def'를 추가해 'abcdef'를 만들어보자.

변수영역1001100210031004
---이름 : a 값 : @5004-

데이터영역5001500250035004
---'abc''abcdef'

이렇게 자세히 뜯어보지 않고 평소에 변수의 값을 변경하면 5003번에 있던 'abc'의 값을 'abcdef'로 바꾼다고 생각했지만 새로운 주소에 'abcdef'의 값을 할당해주고 그 주소를 연결한다. 반대로 'abc'에서 'c'를 삭제하려고 해도 새로운 공간에 'ab'를 저장하고 주소를 연결한다.

단순하게 생각하면 그냥 1003번 주소에 변수명, 변수를 동시에 할당하면 되는데 왜 굳이 따로 값만 가지고 있는 영역의 주소값을 복제하는지 궁금할 것이다. 그 이유는 데이터 변환을 자유롭게 할 수 있으며 메모리를 효율적으로 관리하기 위해서이다.

예를 들어 숫자형은 64bit = 8byte이다. 반면에 문자열은 정해진 규격이 없고 한 글자마다 영어는 1byte, 한글은 2byte처럼 필요한 메모리 용량이 가변적이고 문자열 자체의 글자 수 역시 가변적이다.

이 때 500개의 변수에 숫자 5를 할당하려고 한다. 그러면 (500 X 8)byte가 사용된다. 숫자형은 8byte이기 때문에 변수마다 8byte의 메모리가 필요하기 때문이다.

대신 숫자 5를 한 공간에 할당하고 그 주소값만 연결하면 공간이 2byte일 때 (500 X 2 + 8)byte만 사용된다. 여기서 숫자 2는 변수영역의 메모리 크기이고, 8은 데이터영역의 숫자 5가 할당된 8byte이다.

profile
느리지만 확실하게

0개의 댓글