[Core Javascript] 1. 데이터 타입

OFFDUTYBYBLO·2020년 10월 20일
0

JavaScript

목록 보기
28/40
post-thumbnail

1. 데이터 타입의 종류

1) 기본 개념

Javascript의 데이터 타입에는 크게 두 가지가 있다. 바로 기본형(Primitive type)과 참조형(Reference type)이다.

  • 기본형 : Number, String, Boolean, null, undefined, symbol(ES6)
  • 참조형 : Object, Array, Function, Date, RegExp(정규표현식) / 이하 ES6 추가 Map,WeakMap, Set, WeakSet

일반적으로 기본형은 할당이나 연산시 복제되고 참조형은 참조된다고 알려져 있다. 기본형은 값이 담긴 주솟값을 바로 복제하는 반면 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제한다는 점이 다르다.

2. 데이터 타입에 관한 공학적 배경지식

1) 메모리와 데이터

컴퓨터는 모든 데이터를 0 또는 1로 바꿔 기억한다. 0 또는 1만 표현할 수 있는 하나의 메모리 조각을 비트라고 한다. 각 비트는 고유한 식별자를 통해 위치를 확인할 수 있다.

데이터를 효율적으로 사용하기 위해 8개의 비트로 구성된 바이트라는 단위가 생겼다. 1비트마다 0 또는 1의 두 가지 값을 표현할 수 있으므로 1바이트는 총 256개의 값을 표현할 수 있다. 2바이트는 비트 16개이므로 2의 16승인 65536개의 값을 표현할 수 있다.

C/C++, Java 등의 정적 타입 언어는 메모리의 낭비를 최소화하기 위해 데이터 타입별로 할당할 메모리 영역을 2바이트, 4바이트 등으로 나누어 정해놓았다. 2바이트 크기의 정수형 타입(short)에 범위를 넘어가는 숫자를 입력하면 오류가 나거나 잘못된 값이 저장된다. 이 문제에 제대로 대처하기 위해서는 사용자가 직접 4바이트 크기의 정수형 타입(int) 등으로 형변환해야 한다. 사용자 입장에서는 번거로운 작업이지만 메모리 용량이 매우 부족했던 시절에는 불가피한 선택이였다.

한편 메모리 용량이 과거보다 월등히 커진 상황에서 등장한 자바스크립트는 상대적으로 메모리 관리에 대한 압박에서 자유롭다. 숫자의 경우 정수형인지 부동소수형인지를 구분하지 않고 64비트, 즉 8바이트를 확보한다. 덕분에 개발자가 위와 같은 형변환을 걱정해야 하는 상황이 훨씬 덜 발생한다.

각 비트는 고유한 식별자를 지니고, 바이트 역시 시작하는 비트의 식별자로 위치를 파악할 수 있다. 모든 데이터는 바이트 단위의 식별자, 더 정확하게는 메모리 주솟값을 통해 서로 구분하고 연결이 가능하다.

2) 식별자와 변수

변수는 '변할 수 있는 수' 이다. 수학 용어를 차용했기 때문에 숫자를 의미하는 '수'가 붙었을 뿐, 값이 반드시 '숫자'여야 하는 것은 아니다. 변할 수 있는 데이터를 뜻합니다. 식별자는 어떤 데이터를 식별하는 데 사용하는 이름, 즉 변수명이다.

3. 변수 선언과 데이터 할당

1) 변수 선언

var a;

위의 변수 선언을 말로 풀어쓰면 '변할 수 있는 데이터를 만든다. 이 데이터의 식별자는 a로 한다.'가 된다. 변할 수 있는 데이터이니 선언할 때 undefined이더라도 나중에 다른 값으로 바꾸면 된다.

변수란 결국 변경이 가능한 데이터가 담길 수 있는 공간 또는 그릇이라고 생각할 수 있다. 이 공간에 숫자를 담았다가 문자열을 담는 등의 다양한 명령을 내릴 수 있다.

변수 선언 명령을 받은 컴퓨터는 메모리에서 비어있는 공간 하나를 확보한다. 이 공간에 이름(식별자)을 a라고 지정한다. 이후에 사용자가 a에 접근하고자 하면 컴퓨터는 메모리에서 a라는 이름을 가진 주소를 검색해 해당 공간에 담긴 데이터를 반환한다.

2) 데이터 할당

var a;			// 변수 a 선언
a = 'abc';		// 변수 a에 데이터 할당

var a = 'abc';	// 변수 선언과 할당을 한 문장으로 표현

변수의 선언과 데이터 할당을 하는 방법으로 두 가지 같은 동작을 수행한다. 메모리에서 비어있는 공간을 확보하고 그 공간의 이름을 설정하는 선언 과정은 앞서 살펴본 것과 같다. 할당은 a라는 이름을 가진 주소를 검색해서 그곳에 문자열 'abc'를 할당한다.

그런데 실제로는 해당 위치에 문자열 'abc'를 직접 저장하지는 않는다. 데이터를 저장하기 위한 별도의 메모리 공간을 다시 확보해서 'abc'를 저장하고, 그 주소를 변수영역에 저장하는 식으로 이뤄진다.

1.변수 영역에서 빈 공간을 확보한다.
2.확보한 공간의 식별자를 a로 지정한다.
3.데이터 영역의 빈 공간에 문자열 'abc'를 저장한다.
4.변수 영역에서 a라는 식별자를 검색한다.
5.앞서 저장한 문자열의 주소를 a 식별자 공간에 대입한다.

변수 영역에 값을 직접 대입하지 않고 번거롭게 한 단계 더 거치는 이유는 데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리를 효율적으로 관리하기 위해서이다. 미리 확보한 공간 내에서만 데이터 변환이 가능하다면 변환한 데이터를 다시 저장하기 위해서는 '확보된 공간을 변환된 데이터 크기에 맞게 늘리는 작업'이 선행돼야 한다. 만약 메모리 중간에 데이터를 늘려야하는 상황이 온다면 뒤에 있는 데이터를 전부 뒤로 옮기고, 이동시킨 주소를 각 식별자에 다시 연결하는 작업을 해야 한다. 컴퓨터가 처리해야 할 연산이 많아질 수밖에 없다. 변수 영역과 데이터 영역을 분리하면 중복된 데이터에 대한 처리 효율이 높아집니다.

4.기본형 데이터와 참조형 데이터

1) 불변값

변수와 상수를 구분하는 성질은 '변경 가능성'이다. 불변값과 상수는 명확히 구분할 필요가 있다. 변수와 상수를 구분 짓는 변경 가능성의 대상은 변수 영역 메모리이다. 한 번 데이터 할당이 이뤄진 변수 공간에 다른 데이터를 재할당할 수 있는지 여부가 관건이다. 반면 불변성 여부를 구분할 때의 변경 가능성의 대상은 데이터 영역 메모리이다.

기본형 데이터인 숫자, 문자열, boolean, null, undefined, Symbol은 모두 불변값이다. 변경은 새로 만드는 동작을 통해서만 이뤄진다. 한 번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다.

2) 가변값

기본적인 성질은 가변값인 경우가 많지만 설정에 따라 변경 불가능한 경우도 있고, 아예 불변값으로 활용하는 방안도 있다.

var obj1 = {
  a: 1,
  b: 'bbb'
};

기본형 데이터와의 차이는 '객체의 변수(프로퍼티) 영역'이 별도로 존재한다는 점이다. 객체가 별도로 할애한 영역은 변수 영역일 뿐 '데이터 영역'은 기존의 메모리 공간을 그대로 활용한다. 데이터 영역에 저장된 값은 모두 불변값이다. 그러나 변수에는 다른 값을 얼마든지 대입할 수 있다. 바로 이 부분 때문에 흔히 참조형 데이터는 불변하지 않다라고 한다.

profile
블로그 운영 x

0개의 댓글