Skip to main content

Type System

Type System

프로그래밍 언어가 프로그램에서 가질 수 있는 타입을 이해하는 방법에 대한 규칙 집합

언어의 타입 관련된 문법 체계

  • 규칙
    • 값들을 어떤 기준으로 묶어서 타입을 규정할 것인가?
    • 코드의 타입을 언제 검사할 것인가?
    • 어떻게 타입을 검사할 것인가?

기본적인 타입 시스템의 작동

  1. 코드를 읽고 존재하는 모든 타입과 값을 이해한다.
  2. 각 값이 초기 선언에서 가질 수 있는 타입을 확인한다.
  3. 각 값이 추후 코드에서 어떻게 사용될 수 있는지 모든 방법을 확인한다.
  4. 값의 사용법이 타입과 일치하지 않으면 사용자에게 오류를 표시한다.
타입스크립트는 다음과 같은 순서로 오류를 표시한다.
let firstName = 'Whitney';
firstName.length();
  1. 코드를 firstName이라는 변수를 이해한다.
  2. 초깃값이 "Whitney" 이므로 firstName이 string 타입이라고 결론짓는다.
  3. firstName의 .length 멤버를 함수처럼 호출하는 코드를 확인합니다.
  4. string의 .length 멤버는 함수가 아닌 숫자라는 오류를 표시한다.

타입시스템의 두 가지 종류

  1. 어떤 타입을 사용하는지를 컴파일러에 명시적으로 알려주는 타입 시스템

    • 정적 타입 시스템
      • 코드 실행 이전에 모든 변수의 타입을 고정적으로 결정
      • 엄격하고 고정적인 시스템 (C, Java)
      • 이노테이션을 이용하면 타입스크립트에 명시적으로 타입을 지정할 수 있다.
      • 단점으로 모든 변수에 일일이 타입을 지정해주어야 하기 때문에 코드의 양이 많아지며 유연하지 못하다.
    let a: number = 1; // number
    let b: string = 'hello'; // string
    let c: boolean[] = [true, false]; // boolean 배열
  2. 자동으로 타입을 추론하는 타입 시스템

    • 동적 타입 시스템
      • 코드를 실행하고 나서 유동적으로 변수의 타입을 결정
      • 자유롭고 유연한 시스템 (Python, javaScript)
      • 이노테이션을 사용하지 않으면 타입스크립트가 알아서 타입을 추론한다.
      • 단점으로 코드의 타입 오류를 미리 검사할 수 없으며 예기치 못한 오류가 발생할 수 있다.
  3. 타입스크립트는 점진적 타입 시스템이다.

    • 동적인 타입 시스템의 안전하지 않은 문제를 해결하면서도 정적인 타입 시스템의 귀찮음도 동시에 해결한다.
    • 실행 전 검사를 통한 타입 안정성 확보
    • 자동으로 변수의 타입을 추론함
let a = 1; // number
let b = 'hello'; // string
let c = [true, false]; // boolean 배열

타입스크립트 vs 자바스크립트

타입 시스템 기능자바스크립트타입스크립트
타입 결정 방식동적정적
타입이 자동으로 변환되는가?OX(대부분)
언제 타입을 확인하는가?런타임컴파일
언제 에러를 검출하는가?런타임(대부분)컴파일(대부분)

오류 종류

타입스크립트를 작성하는 동안 가주 접하게 되는 오류 두 가지는 다음과 같다.

  • 구문 오류: 타입스크립트가 자바스크립트로 변환되는 것을 차단한 경우
    • 타입 스크립트가 코드로 이해할 수 없는 잘못된 구문을 감지할 때 발생한다.
    • 타입스크립트가 자바스크립트 파일을 올바르게 생성할 수 없도록 차단한다.
  • 타입 오류: 타입 검사기에 따라 일치하지 않는 것이 감지된 경우
    • 타입스크립트의 타입 검사기가 프로그램의 타입에서 오류를 감지했을 때 발생한다.

할당 가능성

  1. 변수의 초기값을 읽고 해당 변수가 허용되는 타입을 결정한다.
  2. 변수에 새롭게 할당되는 값이 원래 벼눗의 타입과 동일한지 확인한다.
let firstName = 'Cho';
firstName = 'Ahn';
  • 초기 타입이 string이라 새로운 문자열이 할당이 되어도 문제가 생기지 않는다.
let lastName = 'Byeong Min';
lastName = 10; // 오류 발생
  • 초기 타입이 string이라 새로운 타입이 할당되면 오류가 발생한다.