1.1 자바스크립트의 한계

자바스크립트는 매우 유연한 언어이며 가장 큰 특징은 프로그램이 동작하는 시점에 실시간으로 타입이 결정되는 런타임 환경을 제공한다는 점입니다. 그리고 이 환경을 통해 코드를 작성하는 도중에 변수의 타입을 자유롭게 변경할 수 있습니다. 그러나 이 유연한 장점을 제공하는 런타임 환경에서 단점이 에러가 발생하게 될 가능성을 높게 만든다는 것입니다. 이는 개발단계에서 신속한 에러 발견과 수정을 어렵게 하고, 실제 서비스 환경에서 버그의 발생 가능성을 높입니다. 이로 인해 어떤 에러가 있는지 파악하기 어려운 위험한 상황이 초래될 수 있습니다.

1.2 타입스크립트란?

이러한 자바스크립트의 한계를 극복하기 위해 등장한 언어가 타입스크립트입니다. 타입스크립트는 자바스크립트를 기반으로 하는 언어로, 자바스크립트의 모든 기본 문법을 포함하며 추가적으로 타입 시스템을 도입하여 코드를 더 안전하게 관리할 수 있도록 지원하는 언어입니다.

또한 타입스크립트는 오픈 소스 프로젝트이기 때문에 깃허브에서 타입스크립트의 모든 소스 코드를 확인할 수 있으며, 모든 주요 브라우저 및 운영체제에서 지원되고 자바스크립트 코드로 변환되어 어떠한 환경에서도 실행할 수 있습니다.

1.2.1 타입 시스템

타입 시스템이란 타입 검사기가 프로그램에 타입을 할당하는 데 사용하는 규칙들의 집합입니다.

<aside> 💡 규칙 (1) 자바스크립트 언어에서 사용할 수 있는 여러 가지 값들을 타입으로 구분 짓고 기준을 정의합니다. (2) 코드의 타입을 언제 검사할지를 결정하여, 프로그램이 실행되기 전에 정적으로 또는 프로그램 실행 도중에 동적으로 타입을 확인할 수 있습니다. (3) 코드를 분석하는 방법과 규칙을 정의하여 어떻게 타입을 검사할지를 정하여 코드에서 타입 에러를 찾아냅니다.

</aside>

이런 언어의 타입 관련된 문법 체계 규칙들을 모아둔 것을 타입 시스템이라고 합니다. 그리고 타입 시스템은 동적 타입 시스템과 정적 타입 시스템 크게 두 가지로 나뉩니다.

1) 동적 타입 시스템 (Dynamic Type System)

동적 타입 시스템은 코드를 실행하고 나서 그때 그때 마다 유동적으로 변수의 타입을 결정하는 자유롭고 유연한 타입 시스템입니다. 이 타입 시스템을 통해 코드를 작성하는 도중에도 변수의 타입을 자유롭게 변경할 수 있으나 이러한 타입 시스템의 단점은 실행하기 전의 개발 단계에서 에러를 빠르게 발견하고 수정하는 것이 어렵다는 것입니다.

대표적인 언어로는 Python, JavaScript, Ruby 등이 있습니다.

let str = "hello" // string
let num = 12345 // number
let bool = true // boolean

console.log(typeof str) // string
console.log(typeof num) // number
console.log(typeof bool) // boolean

위의 코드와 같이 우리가 직접 변수에 타입을 정해주지 않아도 코드가 실행되는 도중에 유동적으로 결정됩니다.

위의 코드와 같이 동적 타입 시스템의 대표적인 단점은 string 타입으로 선언된 myVar 변수에 12345 라는 값을 재할당하면서 number 타입으로 바뀌게 되었는데 코드는 실행 가능하며 코드를 실행한 후에 에러가 발생하게 된다는 것입니다.

2) 정적 타입 시스템 (Static Type System)

정적 타입 시스템은 코드 실행 이전에 모든 변수의 타입을 고정적으로 결정하는 엄격한 타입 시스템입니다. 이 타입 시스템은 코드를 실행하기 이전에 타입을 검사하여 에러를 빠르게 찾아낼 수 있습니다. 단점은 모든 변수에 일일이 타입을 결정해주어야 하기 때문에 코드의 양이 늘어나는 보일러 플레이트가 발생한다는 것입니다.

대표적인 언어로는 C, C++, Java, C# 등이 있습니다.

// TypeScript
let str:string = "hello";
let num:number = 12345;
let bool:boolean = true;

let strNum = str * num; // Error
let str.parseInt(); // Error