JavaScript - 데이터타입
JavaScript - 데이터타입
데이터 타입의 종류
-
✅ 기본형(Primitive type)_immutability(불변성)
- 값이 담긴 주솟값을 바로 복제
- 숫자(number)
- 문자(string)
- 참과거짓(boolean)
- unll
- undefined
- symbol (ES6 추가)
-
✅ 참조형(Reference type)
- 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제
- Object
- 배열(Array)
- 함수(Function)
- 날짜(Date)
- 정규표현식(RegExp)
- Map, WeakMap (ES6 추가)
- Set, WeakSet (ES6 추가)
메모리 & 데이터
비트(bit)
: 0 또는 1만 표현할 수 있는 하나의 메모리 조각메모리
: 매우 많은 비트들로 구성, 각 비트는 고유한 식별자를 통해 위치 확인 가능바이트(byte)
: 1바이트 8개의 비트로 구성 ❗️모든 데이터는 바이트 단위의 식별자, 메모리 주솟값을 통해 서로 구분하고 연결
변수 & 식별자
-
변수(Variable)
- 변할 수 있는 “무언가”(* 무언가 = 데이터)
-
식별자(Identifier)
- 어떤 데이터를 식별하는데 사용하는 이름(* = 변수명)
변수선언 & 데이터 할당
변수선언
var a;
=> 변할 수 있는 데이터를 만든다 / 데이터의 식별자는 a로 한다 => “변경 가능한 데이터가 담길 수 있는 공간 또는 그릇”
데이터 할당
var a; // 변수 선언
a = "abc"; // 데이터 할당
//
var a = "abc"; // 변수 선언 + 데이터 할당
:: 왜 변수 영역에 값을 직접 대입하지 않고 굳이 번고롭게 한 단계를 더 거치는 이유❓
-
- 데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리를 더욱 효울적으로 관리하기 위해서
- 이미 입력된 값이 변경되어, 차지하는 공간이 늘어나는 경우, 이미 저장된 데이터의 위치를 전부 이동시키고, 이동시킨 주소를 각 식별자에 다시 연결해야 하는 작업에 불필요한 연산 발생
- 입력한 변수가 변경되는 경우, 기존의 동일 공간에 할당하지 않고, 새로운 공간에 저장-> 새로운 주소를 기존 식별자(변수명)에 연결
기본형 데이터와 참조형 데이터
-
불변값
- 기본형 데이터(숫자, 문자열, boolean, null, undefined, symbol)
- 불변성의 여부를 구분할 때의 변경 가능성의 대상 => 데이터 영역 메모리
-
가변값
- 참조형 데이터
- 설정에 따라 변경 불가능한 경우 or 아예 불변값으로 활용
변수 복사 비교
var a = 10;
var b = a;
var obj1 = { c: 10, d: "ddd" };
var obj2 = obj1;
- 기본형 데이터
- 변수 영역의 빈 공간을 확보하고, 식별자를 a로 지정
- 데이터 영역에서 10을 검색하고, 없으면 빈 공간에 저장한 다음 주소 입력
- 복사
- 변수 영역 빈 공간을 확보하고, 식별자를 b로 지정
- 식별자 a 검색
- 확보해둔 변수 영역에 값 대입
👉🏻 재할당되는 변경된 값의 메모리 주소가 변경되어, 기존 변수에 영향 X
- 참조형 데이터
- 변수 영억의 빈공간을 확보하고, 식별자를 obj1로 지정
- 데이터의 영역의 빈 공간을 확보하고, 데이터 그룹이 담겨야 하기 때문에 별도의 변수 영역을 확보해 주소 저장
- 데이터 검색 후, 저장되어 있으면 주소를 변수 영역에 저장, 없는 데이터는 데이터 영역의 빈 공간에 새로 만들어서 연결
- 복사
- 변수 영역의 빈 공간을 확보하고, 식별자를 obj2를 지정
- 식별자 obj1를 검색한 뒤, 데이터 영역을 들고 변수 영역 주소에 대입
👉🏻 해당 객체(obj2) 내 값들의 복사 과정은 동일하지만, 데이터 할당 과정에서 이미 차이가 있기 때문에 변수 복사 이후의 동작에도 큰 차이 발생
🔥 어떤 데이터 타입이든 변수에 할당하기 위해서는 주솟값을 복사해야 하기 때문에, 자바스크립트의 모든 데이터 타입은 참조형 데이터 !
🔥 다만 기본형은 주솟값을 복사하는 과정이 한 번만 / 참조형은 한 단계를 더 거치는 과정의 차이
🚀 참조형 데이터가 “가변값”이라고 설명할 때의 “가변”은 참조형 데이터 자체를 변경할 경우❌ => 그 내부의 프로퍼티를 변경할때만 성립
불변객체
- 내부 프로퍼티를 변경할 필요가 있을 때마다 매번 새로운 객체를 만들어 재할당하기로 규칙을 정하거나 자동으로 새로운 객체를 만드는 도구를 활용한다면 객체의 불변성 확보
-
불변객체 만드는 법
- 새로운 객체를 반환하는 함수 수정or생성 -> 서로 다른 객체 생성
-
얕은 복사(Shallow copy)
- 바로 아래 단계의 값만 복사하는 방법
- 주솟값만 복사하기 때문에 원본과 사본은 동일한 참조값을 가리키게 된다 (= 원본이 바뀌면 사본도 바뀌고, 사본이 바뀌면 원본도 바뀐다)
var copyObject = function(target){
var result ={};
for (var prop in target) {
result[prop] = target[prop];
}
return result;
-
깊은 복사(Deep copy)
- 내부의 모든 값들을 하나하나 찾아서 전부 복사하는 방법
- 참조형 데이터는 다시 그 내부의 프로퍼티들을 복사(= 참조형 데이터가 있을 때 마다 재귀적으로 수행해야만 비로소 깊은 복사)
1 var copyObjectDeep = functon(target){
2 var result = {};
3 if (typeof target === 'object' && target !== null) {
4 for (var prop in target) {
5 result[prop] = copyObjectDeep(target[prop]);
6 }
7 } else {
8 result = target;
9 }
10 return result;
11 };
- ③ : target === ‘object’인 경우 내부 프로퍼티들을 순회하며 copyObjectDeep함수를 재귀적으로 호출
- ⑦, ⑧ : object가 아닌 경우, target을 그대로 지정
- 객체를 복사한 다음에는 원본과 사본이 서로 완전히 다른 객체를 참조하게 되어 어느 쪽의 프로퍼티를 변경하더라도 다른 쪽에 영향 X
-
간단한 깊은 복사 방법
- 객체를 JSON 문법으로 표현된 문자열로 전환했다가, 다시 JSON 객체로 변환
- 단, 메서드(함수)나 숨겨든 프로퍼티인 ‘proto‘나 ‘getter/setter’ 등 JSON으로 변경할 수 없는 프로퍼티들은 모두 무시
- httpRequest로 받은 데이터를 저장한 객체를 복사할 때 등 순수한 정보만 다를 때 유용
var copyObjectViaJSON = function (target) {
return JSON.parse(JSON.stringify(target));
};
Undefined & Null
undefined
: 어떤 변수에 값이 존재하지 않을 경우null
: 사용자가 명시적으로 ‘없음’을 표현하기 위해 대입한 값
참고 : 코어 자바스크립트(Core JavaScript), 정재남