토막 지식

정적 타입 언어 VS 동적 타입 언어, 그리고 Typescript

디정 2024. 6. 13. 12:05

동적 타입 언어와 정적 타입 언어의 차이는 다른 코딩 일기 포스팅에서 몇 번 언급한 적이 있다. 하지만 이 둘의 차이를 좀 더 구체적으로 알고싶어 챗지피티의 힘을 빌렸다.

 

정적 타입 언어인지 동적 타입 언어인지는  변수의 타입이 어느 시점에 결정되느냐에 따라 결정된다. 컴파일 타임(파일 수준)에 결정되면 정적 타입 언어, 런타임(앱 실행)에 결정되면 동적 타입 언어이다. 

 

애초에 프로그래밍에서 정적, 동적 이라는 단어를 사용했을 때의 의미는 대부분 위의 의미와 일맥상통한다. 

 

정적 타입 언어 (Statically Typed Languages) 는 앱 실행 전 모든 변수의 타입이 미리 설정되고, 컴파일러가 타입 체크를 수행해 오류를 미리 잡아낼 수 있어 매우 안정적이다. 하지만 동적 타입 언어에 비해 유연하지 못하고 변수 활용이 어렵다. 정적 타입 언어의 예로는 C, JAVA, C/C++, C#, Typescript 같은 것들이 있다. 

 

동적 타입 언어 (Dynamically Typed Languages) 는 변수의 타입이 앱 실행 중(런타임)에 실시간으로 결정된다. 이는 자바스크립트나 파이썬이 변수의 타입을 따로 명시하지 않을 수 있는 이유다. 런타임 중 시시각각 변할 수 있는 앱 환경에 맞게 비교적 유연하고 자유롭게, 편리하게 코드를 작성할 수 있지만, 멍때리고 작성하다가는 어느 부분에서 에러가 발생할 지 모른다. 그만큼 정적 타입 언어에 비해 불안정할 수 밖에 없다. 동적 타입 언어의 예로는 javascript, python, ruby, php, perl 이런 것들이 있다. (보통 인터프리터 언어들이 대부분 동적 타입 언어인 것 같다. 동작 원리를 생각해보면 그럴 수 밖에 없을 듯 하다.)

 

 

타입 스크립트는 동적 타입 언어?

타입스크립트는 너무 자유분방해서 코드가 길어질 수록 안정성이 떨어지는 자바스크립트의 약점을 보완하기 위해 만들어졌다. 그 목적성을 부각하듯 이름 부터가 'Type(타입) script'다. 위에서는 타입 스크립트를 정적 타입 언어라고 소개했지만, 마냥 그렇게만 이해하기에 타입스크립트는 많이 특수한 언어다. 어디까지나 자바스크립트의 보완을 위해 만들어진, 자바스크립트의 협업자 포지션을 취하고 있기 때문이다.

 

타입 스크립트의 문법은 자바 스크립트의 문법에 규칙을 추가하는 형태로 만들어졌다. 타입 스크립트 공식 문서에서도 자바스크립트 코드를 편하게 가져와 그대로 사용하라는 식으로 안내하고 있다. '하지만, 자바스크립트 코드 위에 타입 스크립트의 타입 검사기가 타입 검사를 할 수 있도록 규칙을 추가해라.' 이게 타입스크립트가 요구하는 작성 규칙이다. 

 

타입 스크립트가 자바 스크립트의 안전성을 보완하는 예시로 이전 포스팅에서 언급했던 enum 타입을 들 수 있다. enum은 자바스크립트에서는 지원하지 않는 자료형으로 타입 스크립트에서 사용 가능하다. enum 타입 사용/미사용 차이점은 아래와 같다. (chat-gpt 제공)

 

const BoardStatus = {
    PUBLIC: 'PUBLIC',
    PRIVATE: 'PRIVATE'
};

let status = BoardStatus.PUBLIC;

// JavaScript에서는 다음과 같은 잘못된 할당을 막을 수 없음
status = 'UNKNOWN';

/*--*/

enum BoardStatus {
    PUBLIC = 'PUBLIC',
    PRIVATE = 'PRIVATE'
}

let status: BoardStatus = BoardStatus.PUBLIC;

// TypeScript에서는 다음과 같은 잘못된 할당을 컴파일 타임에 막을 수 있음
status = 'UNKNOWN'; // 오류: Type '"UNKNOWN"' is not assignable to type 'BoardStatus'

 

타입스크립트의 특이한 점은 자바스크립트의 타입을 정적으로 지정하게 하면서도, 자바 스크립트의 런타임 동작을 존중한다는 것에 있다. 이런 방식이 가능한 이유는 타입 스크립트가 자바 스크립트로 컴파일 될 때 타입 스크립트로 작성했던 모든 타입 정보가 소멸하기 때문이다. 타입스크립트의 타입 검사는 컴파일 타임에만 영향을 주고, 런타임에는 아무런 영향을 주지 않는다. 이는 타입 검사는 타입스크립트 컴파일러가, 실제 런타임 동작은 javascript 엔진이 처리한다는 뜻이다.

 

대략 순서를 정리하면 다음과 같을 것이다.

 

1. 개발자가 타입 스크립트를 작성한다.

2. 타입 스크립트 컴파일러의 타입 검사기가 타입 검사를 한다. (타입 규칙에 어긋나는게 있다면 오류 발생)

3. 타입 검사 종료 후, 컴파일러는 타입 스크립트를 자바 스크립트 언어로 변경(컴파일)

4. 자바스크립트 인터프리터(엔진)가 프로그램 번역 및 실행

 

 

자바 스크립트를 쓰다가 타입 스크립트로 넘어가면 처음에는 장점을 알면서도 불편함을 많이 겪는다. 하지만 사용하는 시간이 길어질 수록 타입 스크립트가 월등히 편하다는 사실을 경험으로 체감하게 된다. 안정성 이전에, 가독성 측면에서 엄청난 수혜를 겪기 때문이다.

 

 

END.