06장 데이터 타입

soonrok·2021년 5월 2일
0

자바스크립트 독학

목록 보기
6/48
post-thumbnail

해당 포스팅은 위키북스의 "모던 자바스크립트 Deep Dive"라는 책을 독학하며 기록하는 글입니다.

자바스크립트(ES6)는 크게 두 가지의 데이터 타입으로 나뉜다.
-> 원시 타입, 객체 타입

그리고 원시 타입은 6가지의 데이터 타입으로 나뉜다.
-> 숫자, 문자열, 불리언, undefined, null, 심벌(Symbol)

다시 말하면 자바스크립트(ES6)의 데이터 타입은 6가지의 원시 타입과 1가지의 객체 타입으로 나뉜다.

숫자 타입

자바스크립트는 C언어같이 int, double, flaot 등 정수와 실수를 다르게 나타내는 타입이 각자 있는 것이 아니라 하나의 숫자 타입만이 존재한다.
-> 정수, 실수, 2진수, 8진수, 16진수 리터럴은 모두 메모리에 배정밀도 64비트 부동소수점 형식의 2진수로 저장된다.

또한 값을 참조하여 해석할 때도 항상 10진수로 해석된다. 더불어 모든 수를 실수로 처리하기 때문에 정수로 표시된다 해도 사실은 실수라는 것에 유의해야 한다.

//C언어
int five = 5;
int two = 2;
int value = five / two;  //2

//자바스크립트(ES6)
var five = 5;
var two = 2;
var value = five / two;  //2.5

문자열 타입

텍스트 데이터를 나타내는 데 사용한다.
0개 이상의 16비트 유니코드 문자의 집합으로 전 세계 대부분의 문자를 표현할 수 있다.
작은따옴표(''), 큰따옴표(""), 백틱(``)을 사용해서 표현할 수 있다.

자바스크립트에서 문자열은 원시 타입이며, 변경 불가능한 값이다. 이것은 문자열이 생성되면 그 문자열을 변경할 수 없다는 것을 의미한다. (이후에 더 자세하게 알아보도록 하자.)

템플릿 리터럴은 ES6부터 도입된 새로운 문자열 표기법으로 본래 문자열이 문자열 내에서 개행을 할 수 없던 문제를 해결해 주었다.(개행을 원할 시 이스케이프 시퀀스를 사용)
자바스크립트의 이스케이프 시퀀스 목록

백틱(``)을 이용해서 템플릿 리터럴을 사용하면 코딩을 할 때 자연스럽게 개행이 들어간 문자열을 작성할 수 있다.

var string = '<ul>\n\t<li>one</li>\n\t<li>two</li>\n</ul>'	//이스케이프 시퀀스를 사용
var template =							//템플릿 리터럴를 사용
`<ul>
  <li> one </li>
  <li> two </li>
</ul>`

//위 두 가지는 출력시 같은 결과를 출력한다.

템플릿 리터럴 내에서는 표현식 삽입이라는 기능을 사용할 수 있으며, ${ }안에 표현식을 넣어서 사용한다.

var first = 1;
var second = 2;

console.log(first + ' + ' + second + ` = ${first+second}`);  // 1 + 2 = 3

문자열은 +연산을 통해서 연결할 수 있다. 피연산자 중에 한 쪽이라도 문자열이라면 문자열 연결 연산자로 동작하며, 결과는 문자열이 된다.


불리언 타입과 undefined, null 타입

불리언 타입의 값은 논리적 참, 거짓을 나타내는 true, false뿐이다.

undefined 타입의 값은 undefined가 유일하다.
undefined는 자바스크립트 엔진이 변수를 선언할 때 처음 초기화할 때 쓰는 값으로, 개발자들은 이를 통해 아직 초기화(할당)되지 않은 변수임을 눈치챌 수 있다.
따라서 개발자가 의도적으로 undefined값을 할당하는 것은 권장하지 않으며, 변수에 값이 없다는 것을 명시하고 싶을 때는 null을 할당한다.

null 타입의 값은 null이 유일하다.
프로그래밍 언어에서 null은 변수에 값이 없다는 것을 의도적으로 명시할 때 사용하며, 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이다.
-> 가비지 콜렉션 수행


심벌(Symbol) 타입

ES6에서 추가된 7번째 타입으로, 변경 불가능한 윈서 타입의 값이다.
심벌 이외의 원시 값은 리터럴을 통해 생성하지만, 심벌은 Symbol 함수를 호출해 생성한다. 이때 생성된 심벌 값은 외부에 노출되지 않으며, 다른 값과 절대 중복되지 않는 유일무이한 값이다.


객체 타입

지금까지 살펴본 6가지 이외의 값은 모두 객체 타입이며, 객체 타입은 이후에 좀 더 자세히 알아보자.


데이터 타입의 필요성

데이터 타입은 도대체 왜 필요할까? 다음의 3가지 이유 때문이다.

  1. 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
  2. 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
  3. 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해

동적 타이핑

C나 자바같은 정적 타입 언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 데이터 타입을 사전에 선언해야 한다.

정적 타입 언어는 변수의 타입을 변경할 수 없으며, 변수에 선언한 타입에 맞는 값만 할당할 수 있다. 또한 컴파일 시점에 타입 체크를 통해 통과하지 못하면 에러를 발생시키고, 프로그램의 실행 자체를 막는다.

int num; //4바이트의 정수 타입의 값만 할당 가능
char c;  //1바이트의 정수 타입의 값만 할당 가능

자바스크립트은 이와 다르게 선언이 아닌 할당에 의해 타입이 결정된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다. 이러한 특징을 동적 타이핑이라 하며, 자바스크립트를 정적 타입 언어와 구별하기 위해 동적 타입 언어라 한다.

하지만 이러한 특징은 데이터 타입에 대해 무감각해질 정도로 편리하다는 점이 문제이다.
복잡한 프로그램에서 변화하는 변수 값을 추적하기 어려울 수 있으며, 자바스크립트 엔진에 의해 암묵적으로 타입이 자동으로 변환되기도 한다. 결국 동적 타입 언어는 유연성은 놓지만 신뢰성은 떨어진다. 이러한 점을 막기 위해서 변수의 사용에 있어서 몇 가지 주의할 사항이 있다.

  1. 변수는 꼭 필요한 경우에 한해 제한적으로 사용한다.
  2. 변수의 유효 범위는 최대한 좁게 만들어 변수의 부작용을 억제한다.
  3. 전역 변수는 최대한 사용하지 않도록 한다.
  4. 변수보다는 상수를 사용해 값의 변경을 억제한다.
  5. 변수 이름은 변수의 목정이나 의미를 파악할 수 있도록 네이밍한다.

마치며

컴퓨터가 이해하는 코드는 어떤 바보도 쓸 수 있다. 하지만 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 쓴다. - 마틴 파울러(Martin Fowler)

profile
I Will be Relaxed Person

0개의 댓글