JavaScript만 사용하는 것과 비교해 TypeScript를 사용하는 이유에 대해 설명해 주세요.
TypeScript는 JavaScript에서 정적 타입 문법을 부여해 확장된 언어(슈퍼셋)이다. JavaScript 엔진을 사용해 자신이 원하는 변수의 타입을 정의하고 프로그래밍을 하면 JavaScript로 컴파일되어 실행할 수 있다.
(컴파일 : 사람이 이해할 수 있는 언어를 컴퓨터가 이해할 수 있는 언어로 바꾸어 주는 과정.
Typescript는 Javascript와 달리 브라우저에서 실행하려면 파일을 한번 변환해 주어야 하는데 이러한 변환 과정도 컴파일 뒤에서 자세히 설명 )
TypeScript를 사용하는 가장 큰 이유는 ‘타입’ 때문이다.
TypeScript는 JavaScript의 단점 중 하나인 동적으로 타입을 지정하는 특징을 보완하면서 등장했다. 동적 타입 지정이란, 변수의 타입이 런타임, 즉 실행 시간에 결정되는 것으로 JavaScript는 대표적인 동적 타입 언어이다.
배우기 쉽고 유연한 장점이 있지만 런타임 에러 발생 가능성을 지니고 있다. 실제로 거대한 규모의 프로젝트에서 의존성이 있는 모듈을 변경했을 때, 다른 모듈에서 에러가 발생하는지 개발 도중에는 알기가 쉽지 않을 것이다.
하지만 TypeScript는 정적 타입 언어로 변수의 타입을 명시적으로 지정해서 사용함으로 컴파일을 하는 과정에서 타입을 결정하게 된다. 변수에 들어갈 값의 형태에 따라 자료형(타입)을 지정해 주어야 하는데, 컴파일 시 자료형에 맞지 않은 값이 들어가면 컴파일 에러를 발생시킨다. 컴파일 과정에서 타입을 지정하기에 컴파일 에러를 예방할 수 있고, 손쉽게 에러를 수정할 수 있게 된다.
또 Javascript는 객체의 필드나 함수의 매개변수로 들어오는 값이 무엇인지 알기 위해 여러 파일을 살펴야 했지만 TypeScript를 사용하면 변수의 이름, 그 테이터의 자료형까지 알 수 있게되어 코드를 쉽고 직관적으로 짤수 있다. (높은 생산성)
TypeScript의 동작 원리에 대해 설명해 주세요.
웹 브라우저나 node.js는 타입스크립트 코드를 바로 실행할 수없기 때문에 자바스크립트로 변환을 해줘야하는데 그 역할을 하는 것이 TSC, 타임스크립트 컴파일러이다. (추가로 타입 검사도 수행한다)
컴파일이란 사람이 이해할 수 있는 언어를 컴퓨터가 이해할 수 있는 언어(바이트코드) 로 바꾸어 주는 과정으로
TypeScript는 JavaScript로 파일을 변환해 주어야 하는 컴파일 과정이 있어야 함
JavaScript 또한 바이트 코드로 컴파일 과정이 필요하다. 정확하게는 JavaScript -> AST(추상 문법 트리) -> 바이트코드 순서대로 변환이 된다. (AST로의 변환과정은 간단히 우리가 쓴 코드의 공백, 주석 등 코드 실행과 관련없는 요소를 모두 제거하여 트리 형태의 구조에 코드를 쪼개어 저장하는 형태)
TypeScript도 같은 과정을 거치지만 AST로 변환한 후 코드 상의 타입 오류를 검사하는 과정이 추가된다. 만약 오류가 있다면 컴파일이 종료되고 아니라면 통과하여 '바이트 코드'가 아닌 'JavaScript코드' 로 변환한 후 컴파일이 종료된다. 정확하게 TypeScript -> AST(추상 문법 트리) -> 타입 검사 (실패시 컴파일 과정 종료) -> JavaScript 코드 순서가 되는것이다. 이 TypeScript의 컴파일 과정(트랜스파일 이라고도 한다) 으로 만들어진 JavaScript를 Node.js나 웹브라우저로 실행하면 위의 JavaScript 컴파일 과정으로 실행되는 것이다.