[코어자바스크립트] CH1 데이터 타입

onschan·2022년 2월 25일
2

코어자바스크립트

목록 보기
1/5
post-thumbnail

코어자바스크립트 - 정재남 저 를 읽고 개인적으로 정리한 내용입니다.

01 데이터 타입의 종류

데이터 타입의 종류에는 기본형과 참조형으로 크게 두가지가 있다.

  • 기본형 : 값이 담긴 주솟값을 바로 복제

  • 참조형 : 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제

02 데이터 타입에 관한 배경지식

메모리와 데이터

메모리 용량이 과거보다 월등히 커진 상황에서 등장한 자바스크립트는 상대적으로 메모리 관리에 대한 아박에서 자유로워졌다. C/C++, 자바 등과 같은 정적 타입 언어들과는 다르게 메모리 낭비를 최소화하기 위한 데이터 타입의 분류(int, char, string ...)의 압박에서 자유로워 진 것이다.

자바스크립트는 이에따라 메모리 공간을 넉넉히 할당하고 예시로 숫자의 경우는 정수형, 부동소수형등을 구분하지 않고 64비트(8바이트)를 먼저 확보해놓고 저장한다.

식별자와 변수

변수와 식별자를 혼용하는 경우가 많다.

  • 변수 : 변할 수 있는 무언가(데이터)
  • 식별자 : 데이터를 식별하는데 사용하는 이름, 변수명

03 변수 선언과 데이터 할당

var a;    // 선언
a = 'abc';   //할당
    	
var a = 'abc';    // 선언과 할당을 동시에
  • 데이터 할당에 대한 메모리 영역의 변화

선언이 이루어지면 메모리의 변수영역에 식별자를 a로하는 변수를 빈 공간에 배치한다.

할당이 이루어지면 할당하려는 데이터 ’abc’를 데이터 영역에서 검색하고 존재하지 않을 시 빈 공간에 저장하고 그 주소를 변수 a 가 저장된 공간의 값에 대입한다.

할당된 값을 변경하고 싶을 시 변수 a가 저장된 공간의 주소만 변경하고 싶은 데이터가 있는 주소로 변경한다.

04 기본형 데이터와 참조형 데이터

var a = 10;
var b = a;
var obj = { c: 10, d: '213' }
var obj2 = obj;
    
b = 15;
obj.c = 20;

b 에 a를 할당했지만 b가 a 자체에 접근하는 것이 아닌 a 가 가지고있는 데이터의 주소만 복사해오는 것이다. 따라서 b = 15 이후에도 a 값에는 변함이 없다.

obj2 = obj; 이후의 두 값이 가리키는 참조값은 똑같으며 obj 에서 프로퍼티를 변경하든, obj2 에서 프로퍼티를 변경하든 두 값은 서로 영향을 미치게 된다.

05 불변 객체

위에서 발생하는 원객체, 복사된 객체의 관계때문에 원하지 않은 원본 데이터의 훼손이 발생할 수 있다.

따라서 불변(immutable)한 객체로 관리하는 것이 좋은데, 주소를 통해 복사하는 것이 아닌 값 그자체를 가져와서 복사하는 것을 깊은 복사라고 하며 이를 위한 immutable.js, baobab.js 등이 인기를 끌고 있다.

재귀적으로 깊은 복살르 할 수 있지만 JSON을 활용해 간단히 깊은 복사를 할 수도 있는데,

JSON.parse(JSON.stringify(target));

이렇게 객체를 JSON 문법으로 표현된 문자열로 전환했다가 다시 JSON 객체로 바꾸는 방법으로 깊은 복사를 구현할 수 있다.

06 undefined와 null

undefined와 null은 그 자체적으로 ‘비어있음'을 의미하기는 하지만 undefined의 경우 자바스크립트 엔진에서 자체적으로 값을 할당하고 사용하기 때문에 사용자가 ‘비어있음’을 의미하기 위해 직접 할당할 경우 사용의 의미가 모호해질 수도 있다. 따라서 ‘비어있음’ 직접 할당하고 싶으면 undefined 의 사용은 지양하고 null 을 사용하는 것이 좋다.

배열 내에서는 실제로 데이터가 들어있지 않은 부분은 순회의 대상이 되지 않으며 그때는 undefined 와 null이 아닌 empty 로 표시된다.

07 정리

  • 자바스크립트 데이터 타입 : 기본형(불변값) + 참조형(가변값)
  • 변수 : 변경가능한 데이터가 담길 수 있는 공간
  • 식별자 : 그 변수의 이름
  • 참조형 데이터 타입을 가변값으로 여겨야 하기 때문에 불변값으로 사용하기 위해선 깊은 복사를 통해 사용해야 한다.
  • ‘없음'을 나타내는 undefined 와 null 중 undefined를 대입해서 사용하는 상황은 지양해야 한다.
profile
https://www.onschan.me

0개의 댓글