const secondStudyLog = "데이터타입(datatype)";

프로그래밍에서 필수적인 것은 데이터이다. 데이터로, 변수의 값에 들어가는 것들에는 다양한 유형이 있다. 위의 코드처럼 문자열(string), 전의 예시에서 let x = 10 같은 숫자일 수도 있으며… 그 외의 다양한 유형이 있다. 이번 로그에서는 이런 데이터타입(data type) 에 대/해서 다뤄 볼 것이다.

1. 데이터 타입 구분이 왜 필요한가?

다 ‘같은’ 값 아닌가?

배울 당시에는 ‘그래, 외우기 쉽게 그런 구분이 필요 있는가 보지..’ 하고 큰 고민 없이 넘겼으나, TIL (이라기는…주에 2번 쓰지만)을 쓰다 보니 대체 그런 게 필요한 가에 의문이 생겼다.

  • <모던 자바스크립트 Deep Dive p.68 ~ p.70>를 공부하고 요약한 내용이다.

메모리에 값을 저장하려면 확보해야 할 메모리 공간의 크기를 결정해야 한다. …(중략)… 자바스크립트 엔진은 데이터 타입, 즉 변수에 할당되는 값의 종류에 따라 정해진 크기의 메모리 공간을 확보한다.

데이터 타입 구분이 필요한 이유는 간단히 말해서 ‘메모리 공간 손실 없이 값을 저장하기 위한 공간 확보’ 를 위해 필요한 것이라는 설명이다.

컴퓨터는 한 번에 읽어 들여야 할 메모리 셀의 크기를 어떻게 알 수 있는 것일까? score 변수에 숫자 타입의 값이 할당되어 있으므로 자바스크립트 엔진은 score 변수를 숫자 타입으로 인식한다.

읽어 들일 때 변수에 할당된 데이터의 값을 보고 한 번에 읽어야 할 메모리 셀의 크기를 정하는 것이란 설명이다.

(생략)… 메모리에서 읽어 들인 2진수를 어떻게 해석해야 하느냐다. 모든 값은 데이터 타입을 가지며, 메모리에 2진수, 즉 비트의 나열로 저장된다. 메모리에 저장된 값은 데이터에 따라 다르게 해석될 수 있다. 예를 들어, 메모리에 저장된 값 0100 0001을 숫자로 해석하면 65지만 문자열로 해석하며 ‘A’다.

메모리에는 2진수, 비트의 나열로 저장된다. 같은 비트도 데이터 타입 구분 덕분에 다른 값으로 해석 할 수 있던 것이다.

결론: 데이터 타입이 필요한 이유는 세 가지라는 것이다.

  1. 메모리 공간 손실 없이 값 저장을 위해 확보해야 할 공간을 결정하기 위해.
  2. 값을 참조할 때 한 번에 읽어내기 위한 메모리 공간의 크기를 결정하기 위해
  3. 저장 된 2진수 해석을 어떻게 할 지 결정하기 위해.

컴퓨터가 메모리에 값의 저장, 참조, 해석하는 과정에서 데이터 타입 구분은 필수적이라는 것이구나! 궁금증이 어느 정도 해결되었다.


2. 데이터 타입 종류

데이터 타입 구분이 필요한 이유를 알게 되었으니, 이제 그 종류를 살펴보자!

Javascript 에서는 데이터 타입기본 타입(primitive type)참조 타입(reference type)으로 구분한다.

구분 기본 타입 참조 타입
데이터 타입 숫자, 문자열, 불리언, undefined, null, 심벌 객체, 함수, 배열 등

10, 1, 2, …은 숫자(number), 큰 따옴표(””) 나 작은 따옴표(’’) 혹은 백틱(``)을 사용하는 문자열(string), true와 false로 나타내는 불리언(boolean). 이에 더해서 undefined,null은 비슷하지만 다른 데이터 타입이다.

` 백틱(``) `은 다음과 같이 사용할 수 있다.

let age = 25;

let ageString = `제 나이는 ${myAge}`
let string = `백틱은
							줄 바꿔서도 쓸 수 있다!`

//

let string2 = "줄바꿈
							 안됨!"

let string2 = '줄바꿈
							 안됨! 2222 '

2-1. undefined와 null

undefined는 단어 그대로 ‘정의되지 않음‘을 말한다.

let score;

위의 예시에서는 변수에 어떤 값도 할당하지 않고 변수 선언만 하였다. 이런 경우 console에 나타내면 어떤 값이 나올까. 바로 undefined 이다. Javascript 의 경우, 아무런 값도 지정해주지 않으면 그 변수에 자동적으로 undefined가 할당되는 것이다. 그러므로 우리가 보기엔 score 변수에는 아무것도 할당하지 않았지만, Javascript 엔진undefined로 값을 초기화 시킨 것이고. 우리가 score 변수에 값을 할당하면 undefined에서 새로운 값으로 초기화를 하는 것이다.

그렇다면, 만일 이미 특정 값을 할당한 변수의 값을 없애고 싶을 때 아래와 같은 코드를 입력하면 될까?

let score;
score = 100;

score = undefined;

❌!! 이는 본래 undefined의 의미(?)를 해친다.

만일 어떤 변수를 console.log 해보았는데 undefined가 나왔다. 그러면 그걸 보는 개발자는 당연히, ‘아! 아직 이 변수에 어떤 값도 할당하지 않았구나!’라고 이해한다. 우리의 의도는 그게 아닌데?…

이런 경우에 null을 이용한다. null은 변수에 값이 없다는 것을 의도적으로 표현할 때 사용한다. 아직 할당하지 않음, 이 아니라 그 안에 값이 없다! 를 정확히 의미하는 게 null인 것이다.

2-2. 심벌(symbol)

이 타입은 강의를 통해 배운 것은 아니지만… 모던 자바스크립트 Deep Dive에서 보고 추가로 넣었다.

심벌은 ES6에서 추가된 7번째 타입으로, 변경 불가능한 원시(기본) 타입의 값이다. 심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다. 따라서 주로 이름이 충돌할 위험이 없는 객체의 프로퍼티 키를 만들기 위해 사용한다.

라고 한다… 지금은 데이터 타입에 대해 간략히 배우는 것이니 ‘그냥 그렇구나~’ 하고 넘어가자. 다음에 다루기로!

2-3. 객체

위에서 설명한 데이터 타입 이외의 값은 모두 객체다. 객체란 무엇일까?....

자바스크립트는 객체 기반 언어이므로 객체에 대해 알아가는 것이 중요할 것이다. 이는 앞으로 차근히 다루도록 하겠다!


정리

데이터 타입이 필요한 이유는, 컴퓨터는 데이터를 2진수의 형태로 메모리에 저장하고, 참조하고, 알맞게 해석하기 때문에 필요한 것이다. 데이터 타입 구분이 있기 때문에 변수에 할당한 값의 크기를 메모리 공간 손실없이 저장할 수 있고, 메모리에 있는 변수를 한 번에 참조할 수 있으며, 같은 2진수로 저장된 값도 숫자와 문자열 등을 구분해서 해석할 수 있다.

새롭게 배운 내용들을 정리해보았다. 역시… 모든 것은 이유가 있다!

사전스터디를 시작한지 일주일이 지났다. 강의도 재밌고, 문제풀이도 재밌지만, TIL을 작성하는 것만큼 고민을 많이 하면서 재미있는 작업은 없는 듯하다. 저번 글에서도 말한 것처럼, 그저 Javascript로 코딩을 할 줄 아는 사람이 아닌 Javascript를 정확히 이해하는 사람으로 거듭나는 것 같은 느낌이 든다. TIL 덕분에…..

다음 시간에는 함수 혹은 제어문 if를 다룰 생각이다. 아마 함수를 먼저 다루지 않을까….싶다!

2022 - 01 - 22