6. 데이터 타입

  • 데이터 타입은 값의 종류를 말한다.
  • 모든 값은 데이터 타입을 갖는다.

자바스크립트(ES6)는 7개의 데이터 타입을 제공하며,
6개의 원시타입(number, string, boolean, undefined, null, symbol)과 객체타입으로 분류할 수 있다.

6.1 숫자타입

  • 다른언어와 다르게 정수와 실수 타입을 구분하지 않고 숫자 하나로 취급한다.
  • 64비트 부동소수점 형식을 따라, 모든 수를 실수로 처리한다.
  • 실수 외에 특별한 값(Infinity, -Infinity, NaN)도 숫자타입이다.

6.2 문자열타입

  • 텍스트 데이터를 나타내는 데 사용
  • 문자열은 0개 이상의 16비트 유니코드 문자의 집합이다
  • 작은따옴표(' '), 큰따옴표(" "), 백틱( )으로 텍스트를 감싸 표기한다.
  • 자바는 문자열이 객체로 표현되지만, 자바스크립트는 문자열이 원시타입이며 불변값(immutable value)이다.

6.3 템플릿리터럴

  • ES6부터 도입된 문자열 표기법으로, 일반 문자열과 달리 백틱( )을 사용해 표현한다.
  • 멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능을 제공한다.
  • 템플릿 리터럴은 런타임에 일반 문자열로 변환되어 처리된다.

6.3.1 멀티라인 문자열

  • 일반 문자열 내에서는 줄바꿈(개행) 등이이 허용되지 않아, 줄바꿈울 표현하려면 \n 등의 이스케이프 시퀀스를 활용해야 했다.
  • 템프릿 리터럴 내에서는 이스케이프 시퀀스를 사용하지 않고도 줄바꿈이 허용되며,
  • 모든 공백도 있는 그대로 적용된다.
var template = `<ul>
  <li><a href="#">Home</a></li>
</ul>`;

console.log(template);
/*
<ul>
  <li><a href="#">Home</a></li>
</ul>
*/


6.3.2 표현식 삽입

  • 문자열은 연산자 +를 사용해 연결할 수 있으나 ES5의 문자열은 문자열을 여닫는 과정이 필요하였다.
  • 템플릿 리터럴 내에서는 표현식 삽입을 통해 간단히 문자열 연산이 가능하다.
  • 표현식을 삽입하려면 ${}으로 표현식을 감싼다.
    이 때, 표현식의 평가결과가 문자열이 아니더라도 문자열로 타입이 강제로 변환된다.
// ES5: 문자열 연결
var first = 'Ung-mo';
var last = 'Lee';
console.log('My name is ' + first + ' ' + last + '.'); // My name is Ung-mo Lee.

// ES6: 템플릿 리터럴 표현식 삽입
var first = 'Ung-mo';
var last = 'Lee';
console.log(`My name is ${first} ${last}.`); // My name is Ung-mo Lee.

// ES6: 템플릿 리터럴 표현식 삽입
console.log(`1 + 2 = ${1 + 2}`); // 1 + 2 = 3


6.4 불리언 타입

  • 불리언 타입의 값은 논리작 참, 거짓을 나타내는 true와 false뿐이다.
  • 프로그램의 흐름을 제어하는 조건문에서 자주 사용한다.

6.5 undefined 타입

  • undefined타입의 값은 undefined이 유일하다.
  • var키워드로 선언한 변수는 암묵적으로 자바스크립트 엔진에 의해 undefined으로 초기화 된다.
  • 선언 이후 값이 할당되지 않은 변수 임을 나타내기 위한 타입이다.
  • 개발자가 명시적으로 undefined을 변수에 할당하는 것은 취지와 어긋나므로 권장되지 않는다.
  • 값이 없다는 것을 명시하고 싶다면 null을 사용하라.

6.6 null 타입

  • null타입의 값은 null이 유일하다.
  • null은 변수에 값이 없다는 것을 의도적으로 명시(의도적 부재)할 때 사용한다.
  • 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이다.
  • 자바스크립트 엔진은 누구도 참조하지 않는 메모리 공간에 대해 가비지 콜렉션을 수행할 것이다.
  • 함수가 유효한 값을 반환할 수 없는 경우 null을 반환하기도 한다.

6.7 심벌 타입

  • ES6에 추가된 7번째 타입으로, 변경 불가능한 원시 타입의 값이다.
  • 심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다.
  • 주로 이름이 충돌할 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다.
  • 심벌은 Symbol함수를 호출해 생성한다.
  • 이때 생성된 심벌값은 외부에 노출되지 않으며, 다른 값과 중복되지 않는다.
// 심벌 값 생성
var key = Symbol('key');
console.log(typeof key); // symbol

// 객체 생성
var obj = {};

// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다.
obj[key] = 'value';
console.log(obj[key]); // value


6.8 객체 타입

  • 자바스크립트는 객체 기반의 언어이다.
  • 앞서 살펴본 6가지 원ㅌ시타입 이외의 값은 모두 객체 타입이다.
  • 11장의 원시 값과 객체의 비교에서 자세히 살펴볼 예정.

6.9 데이터 타입의 필요성

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

6.10 동적 타이핑

  • 자바 같은 정적 타입 언어는 변수를 선언할 때 타입을 사전에 선언(명시적 타입 선언)해야 한다
    정적 타입 언어는 컴파일 시점에 타입체크를 수행하여 타입의 일관성을 강제함으로써
    안정적인 코드의 구현을 통해 런타임에 발생하는 에러를 줄인다.
  • 자바스크립트는 동적 타입 언어이다.
    자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)된다.
    재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.(동적 타이핑)
  • 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려울 수 있으며,
    개발자의 의도와는 상관없이 자바스크립트 엔진에 의해 타입이 자동으로 변환되기도 한다.
    동적타입 언어는 유연성은 높지만 신뢰성이 떨어진다.
  • 동적 타입 언어에서는 다음의 사항을 주의하여 변수를 사용해야 한다.
    • 변수는 곡 필요한 경우에 한해 제한적으로 사용한다.
    • 변수의 유효범위(스코프)는 최대한 좁게 만들어 변수의 부작용을 억제해야 한다.
    • 변수보다는 상수(constant)를 사용해 값의 변경을 억제한다.
    • 변수의 이름은 목적이나 의미를 파악할 수 있도록 해야한다.

(이러한 동적 타입 언어의 부작용 때문에 TypeScript가 등장하게 된 것 같다. 아래 블로그 글 참조)

https://velog.io/@yeonjin1357/TypeScript-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-vs-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8

 

[TypeScript] 타입스크립트 vs 자바스크립트

타입스크립트와 자바스크립트 전격 비교하기 😤

velog.io


https://velog.io/@simplicityyy/TypeScript-%EB%93%B1%EC%9E%A5%EB%B0%B0%EA%B2%BD

 

TypeScript - 등장배경

동적 타입과 정적 타입의 특성 동적 타입(Dynamic Typing) 컴파일 단계없이 인터프리터와 같은 코드 해석기가 코드를 라인 단위로 읽으면서 바로 코드를 실행할 때 코드 변수 타입이 정해지는 방식

velog.io

 

5.1 값

  • 값은 표현식이 평가되어 생성된 결과이다.
  • 모든 값은 데이터 타입을 가진다.
  • 메모리에 비트의 나열(2진수)로 저장된다.
  • 값은 다양한 방법(표현식, 리터럴 등)으로 생성할 수 있다.

5.2 리터럴

  • 사람이 이해할 수 있는 문자나, 약속된 기호를 사용해 값을 표기하는 표기법이다.
  • 정수, 부동소수점, 2진수, 8진수, 16진수, 문자열, 불리언, null, undefined, 객체, 배열, 함수, 정규표현식 등이 포함된다.

5.3 표현식

  • 값으로 평가될 수 있는 문이다.
  • 리터럴, 식별자, 연산자, 함수호출 등이 표현식에 포함되며, 각각의 조합도 표현식이 될 수 있다.
  • 표현식과 값(표현식이 평가된 결과)은 동치다.

 


5.4 문

  • 문statement은 프로그램을 구성하는 기본단위이자 최소 실행 단위이다.
  • 문에는 선언문, 할당문, 조건문, 반복문 등이 있다.
  • 토큰token은 문보다 더 작은 단위로, 문법적인 의미를 가진 최소 단위이다. 토큰에는 키워드, 식별자, 연산자, 리터럴, 세미콜론, 마침표 등이 포함된다.


 

5.5 세미콜론

  • 문의 종료를 나타낸다.
  • 코드블록{}은 자체종결성을 갖기 때문에 세미콜론을 붙이지 않는다.

5.6 표현식 문 / 비 표현식 문

  • 표현식 문은 값으로 평가 가능하다.(값 반환)
  • 비표현식 문은 값으로 평가될 수 없는 문이다.(undefined 반환)

4.1 변수의 개념과 변수의 필요성

  • 변수란, 하나의 값을 저장(할당)하기 위해 확보한 메모리 공간 자체
    혹은 그 메모리 공간을 식별(참조)하기 위해 붙인 이름. (여러 값을 저장하려면 배열이나 객체 같은 자료구조 사용)
  • 변수를 사용하지 않으면 메모리 주소를 직접 사용해야하는데,
    이는 코드가 실행될때마다 메모리 주소가 변경되는 메모리의 특성상 시스템 오류를 발생시킬 수 있음.
    따라서 데이터 관리를 위해 변수의 개념을 도입 함.

4.2 식별자

  • 식별자는 어떤 값을 구별하여 식별할 수 있는 고유한 이름이다.(변수명, 함수명, 클래스명 등등)
  • 식별는 선언에 의해 자바스크립트 엔진에 존재를 알린다.

4.3 변수선언

  • 변수선언이란 변수를 생성(메모리 공간을 확보하고 변수이름과 확보한 메모리공간을 매핑)하는 것이다.
  • 변수선언에 의해 확보된 메모리는 확보가 해제되기 전까지 보호된다
  • 변수선언시에는 var, let, const 키워드를 사용한다.(let과 const는 ES6부터 도입)
  • var의 장점은 암묵적 초기화로 garbage value 위험으로부터 안전하다는 것이다.
    단점은 블록레벨이 아닌 함수레벨 스코프를 지원하여 의도치 않은 전역변수를 선언할 수 있다는 것이다.

4.4 호이스팅

  • 자바스크립트 엔인의 소스코드 실행과정은 평가과정과 실행과정 2가지로 나뉜다.
  • 평가과정에서는 선언문(변수, 함수 선언문 등)을 실행하고,
    실행과정에서는 선언문 이외의 소스코드를 한 줄씩 실행한다.
  • 이처럼 자바스크립트에서 선언문이 코드 선두로 끌어올려진 것처럼 선언문이 다른 코드보다 우선실행되는 특성을 호이스팅이라고 한다.

4.5 값 할당

  • 변수선언과 값의 할당을 한 줄로 단축 표현해도,
    2개의 문으로 나누어 각각 실행된다.(평가과정과 실행과정이 나뉘므로)
// 작성코드
var score = 80;

// 실행코드
var score;
score = 80;
  • 변수에 값을 대입 혹은 저장하는 것을 할당이라 한다.

4.6 값 재할당

  • 이미 값이 할당되어 있는 변수에, 값을 또다시 할당하는 것을 값의 재할당이라 한다.
  • 값을 재할당 할 수 없는 변수는 상수constant라 하며, const 키워드로 상수를 표현할 수 있다.
  • 재할당 시, 기존 메모리 공간에 덮어쓰는 것이 아니라,
    새로운 메모리공간을 확보하고 식별자가 가리키는 메모리주소를 변경한다.
    기존 메모리 공간의 값은 GC에 의해 자동해제되지만, 언제 해제될지는 알 수 없다.(매니지드 언어의 특성)

4.7 식별자 네이밍 규칙

  • 식별자는 숫자로 시작x, 예약어x, 대부분의 특수문자x
  • 네이밍 컨벤션에는 카멜케이스, 스네이크케이스, 파스칼케이스, 타입헝가리안케이스 등이있다.
    일반적으로 변수와 함수는 스네이크케이스, 생성자함수와 클래스는 카멜케이스로 네이밍한다.
//카멜 케이스
var camelCase

//스네이크 케이스
var snake_case;

//파스칼 케이스
var PascalCase;

//헝가리안 케이스
var varHungarianCase;

+ Recent posts