Published on

TypeScript를 사용하는 이유

타입 시스템이란?

먼저 우리가 사용한 js에는 타입 이라는 한계가 존재합니다.

타입 시스템이란
언어에서 사용할 수 있는 여러가지 값들을 어떠한 기준으로 묶어 타입으로 정할지 결정하고,
또 코드의 타입을 언제 검사할지.. 등의 우리가 언어를 사용할 때, 타입과 관련해서 지켜야하는 규칙을 모아둔 체계입니다.

타입 시스템은 2가지로 나눌 수 있습니다. 정적 타입 시스템, 동적 타입 시스템으로 나뉩니다.

먼저 정적 타입 시스템은 코드 실행전에 모든 변수의 타입을 고정적으로 결정합니다.
언어는 대표적으로 C, Java가 있습니다.
그리고 동적 타입 시스템은 코드를 실행하고 나서 그때마다 유동적으로 변수의 타입을 결정합니다.
언어는 대표적으로 Python, JavaScript가 있습니다.

정리하면 정적 타입 시스템은 엄격한 시스템이고, 동적 타입 시스템은 자유롭고 유연한 시스템입니다.

정적 타입 시스템 vs 동적 타입 시스템

타입 시스템특징대표 언어
정적 타입 시스템코드 실행 전에 변수 타입이 결정됨C, Java, TypeScript
동적 타입 시스템코드 실행 중 변수 타입이 변경될 수 있음Python, JavaScript

정적 타입 시스템은 코드의 안전성을 높여주지만, 상대적으로 엄격한 규칙을 요구합니다.
동적 타입 시스템은 유연하지만, 예상치 못한 타입 오류를 초래할 수 있습니다.


동적 타입 시스템

Js가 사용하는 동적 타입 시스템은 기본적으로 변수의 타입들을 코드가 실행 되는 도중에 결정하기 때문에 우리가 미리 변수에 타입을 설정하지 않아도 된다는 유연함을 장점으로 갖습니다.
밑의 예제 코드를 보여드리겠습니다.

let a = hello
a = 12345

이러한 특징은 하나의 변수에 다양한 타입의 값을 넣을 수 있기 때문에 유연하다는 장점이 있지만, 반대로 단점이 크게 존재합니다.

let a = 'hello'
a = 12345

a.toUpperCase()

위 코드에서 toUpperCase() 메서드는 문자열에서만 동작하는데, a가 숫자로 변경되었기 때문에 실행 시 오류가 발생합니다.
JavaScript에서는 런타임에서야 오류를 감지하기 때문에, 코드가 실행되기 전까지 이러한 실수를 발견하기 어렵습니다.


정적 타입 시스템

반면 C나 Java와 같은 언어들은 정적 타입 시스템을 가지고 있습니다.
이 언어들은 코드를 실행하기 전에 모든 변수의 타입을 결정합니다.

JavaScript와 반대로 변수들을 선언함과 동시에 타입도 함께 명시해야합니다.

int a = 5;
String b = 'hello';

int c = a * b //오류 발생

이렇듯 JavaScript 같은 동적 타입 시스템을 사용하는 언어와 달리 자바같은
정적 타입 시스템을 사용하는 언어는 타입 관련 오류가 있으면 에디터 상에서 애초에 오류를 바로 알려주고 실행 되기 전에 타입을 잘못 쓰지 않았는지 검사까지 모두 마치고 실행되기 때문에 오류가 있다면 애초에 실행이 불가능합니다.
그래서 사용자가 의도치 않은 실수를 하더라도 미리 확인할 수 있는 기회가 주어질 수 있습니다.

정적 타입 시스템의 단점

정적 타입 시스템이라고 모든게 다 좋은건 아닙니다. 정적 타입 시스템 언어들에서는 모든 변수에 일일히 타입을 다 정의해야 하기 때문에 일단 매우 귀찮고 우리가 작성해야 하는 코드의 양이 상당히 늘어납니다.


TypeScript: 점진적 타이핑

TypeScript는 정적 타입 시스템과 동적 타입 시스템의 장점을 결합한 언어입니다. 즉, JavaScript의 유연성을 유지하면서도, 정적 타입 검사를 통해 오류를 방지할 수 있습니다.

일단 타입스크립트에서는 마치 정적 타입 시스템처럼 변수의 타입을 코드 실행 전에 결정하고 타입 오류가 없는지 프로그램 실행전에 코드를 검사합니다

let a: number = 1
a.toUpperCase() // 오류를 미리 알려줌

위 코드와 같이 a를 number로 미리 정의했기 때문에 toUpperCase() 메서드를 사용하려 하면 미리 오류를 띄워 알려줍니다.
또한 정적 타입 시스템처럼 안전하면서도 마치 동적 타입 시스템처럼 모든 변수에 일일이 우리가 직접 타입을 지정하지 않아도 됩니다.

TypeScript의 장점

  • 컴파일 단계에서 타입 오류 감지 → 런타임 오류 방지
  • 점진적 도입 가능 → 기존 JavaScript 프로젝트에 부분적으로 적용 가능

결론

JavaScript의 동적 타입 시스템은 유연하지만, 예상치 못한 버그를 초래할 수 있습니다.
TypeScript는 정적 타입 검사를 통해 이러한 문제를 해결하면서도, JavaScript의 장점을 유지할 수 있도록 설계되었습니다.