TIL-59 JavaScript 데이터 타입

PRB·2021년 11월 30일
0

JavaScript

목록 보기
20/24
post-thumbnail

1. 데이터

자바스크립트의 데이터 타입에는 크게 두 가지가 있다. 바로 기본형과 참조형이다.

원시값

  • Number
  • String
  • Boolean
  • Null
  • Undefined
  • Symbol

참조값

  • Object
  • Arrary
  • Function
  • Date
  • Map
  • Set

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

1. 변수 선언

var a;

위 코드를 말로 하자면 "변할 수 있는 데이터를 만든다. 이 데이터의 식별자는 a로 한다."이다. 변수란 변경 가능한 데이터가 담길 수 있는 공간 또는 그릇이라고 생각할 수 있겠다.
위 코드를 명령 받은 컴퓨터는 메모리에서 비어있는 공간 하나를 확보한다.
이 공간의 이름(식별자)을 a라고 지정한다. 여기까지가 변수 선언 과정이다.
이후에 사용자가 a에 접근하고자 하면 컴퓨터는 메모리에서 a라는 이름을 가진 주소를 검색해 해당 공간에 담긴 데이터를 반환할 것이다.

2. 변수 할당

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

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

맞춤법 검사를 원하는 단어나 문장을 입력해 주세요. a라는 이름을 가진 주소를 검색해서 그곳에 문자열 'abc'를 할당하면 될 것 같다.

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

왜 변수 영역에 값을 직접 대입하지 않고 굳이 번거롭게 한 단계를 더 거치는 이유는 데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리를 더욱 효율적으로 관리하기 위한 것이다.

문자열 'abc'의 마지막에 'd'를 추가,제거 하라고 해도 결과의 문자열을 새로 만들어 별도의 공간에 저장한다.

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

변수와 상수를 구분하는 성질은 '변경 가능성'이다. 바꿀 수 있으면 변수, 바꿀 수 없다면 상수이다. 하지만 상수와 불변 값과 같은 개념으로 생각할 수 있는데 다른 개념이다. 변수와 상수를 구분 짓는 변경 가능성의 대상은 변수 영역 메모리이다. 반면 불변성 여부를 구분할 때의 변경 가능성은 데이터영역 메모리이다.

1. 불변성

var a = 'abc';
a = a + 'def';

var b = 5;
var c = 5;
b = 7;

변수 a에 문자열 'abc'를 할당했다가 뒤에 'def'를 추가하면 기존의 'abc'가 'abcdef'로 바뀌는 것이 아니라 새로운 문자열 'abcdef'를 만들어 그 주소를 변수 a에 저장한다. 'abc'와'abcdef'는 완전히 별개의 데이터이다.

변수 b에 숫자 5를 할당한다. 그러면 컴퓨터는 일단 데이터 영역에서 5를 찾고, 없으면 데이터 공간을 하나 만들어 저장한다. 그 주소를 b에 저장한다. 다시 같은 수인 5를 할당하려고 할 때 컴퓨터는 데이터 영역에서 5를 찾는다. 이미 만들어놓은 값이 있으니 그 주소를 재활용한다.

이처럼 문자열 값도 한 번 만든 값을 바꿀 수 없고, 숫자 값도 다른 값으로 변경할 수 없습니다. 변경은 새로 만드는 동작은 통해서만 이뤄진다. 이것이 바로 불변 값의 성질이다. 한 번 만들어진 값은 가비지 컬렉팅을 당하지 않는 한 영원히 변하지 않는다.

2. 가변성

var obj1 = {
  a: 1,
  b: 'bbb'
};
  1. 컴퓨터는 우선 변수 영역의 빈 공간을 확보하고, 그 주소의 이름을 obj1로 지정한다.
  2. 임의의 데이터 저장 공간에 데이터를 저장하려고 보니 여러 개의 프로퍼티로 이뤄진 데이터 그룹이다. 이 그룹 내부의 프로퍼티들을 저장하기 위해 별도의 변수 영역을 마련하고, 그 영역의 주소를 임의의 데이터 저장 공간에 저장한다.
  3. 임의의 데이터 저장 공간에 각각 a와 b라는 프로퍼티 이름을 지정한다.

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

profile
사용자 입장에서 사용자가 원하는 것을 개발하는 프론트엔드 개발자입니다.

0개의 댓글