요약

  • 타입스크립트는 런타임에는 덕 타이핑 특성을 가지고, 컴파일에는 구조적 타이핑을 가진다.
  • 타입스크립트의 타입 체커는 집합 단위로 체크하기 때문에 중복을 줄일 수 있다.

내용

  • 자바스크립트는 덕 타이핑(duck typing)기반이다.
    • 어떤 함수의 매개변수값이 모두 제대로 주어진다면, 그 값이 어떻게 만들어졌는지 신경 쓰지 않고 사용한다.
    • “만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.”
    • 콘센트나 돼지코냐 “이름”은 중요하지 않다. 꽂을 수 있는가? 꽂을 수 있으면 콘센트라고 부를 수 있다.
class Duck {
  quack() {
    console.log('꽥!')
  }
  feathers() {
    console.log('깃털은 검정색과 흰색')
  }
}
class Human {
  quack() {
    console.log('사람인데요? 꽥!')
  }
  feathers() {
    console.log('사람이라 깃털은 없어요. 하지만 털은 있습니다.')
  }
}
 
function inTheForest(duck) {
  duck.quack()
  duck.feathers()
}
 
inTheForest(new Duck())
inTheForest(new Human())
  • 위 예시에서 봐야하는 건 2가지이다. inTheForest의 함수 선언부, inTheForest의 함수 실행부이다.
    • 함수 선언부는 따로 지정된 타입이 없다.
    • 함수 실행부는 다른 이름의 두 클래스 객체가 들어간다. 어떤 객체든 들어가지만 내부 실행 조건에 따라서 런타임상에서 오류가 발생한다.
  • 이를 통해 유연하게 작성할 수 있어서 생산성을 높일 수 있다.

  • 타입스크립트는 구조적 타이핑이다.
    • 구조적 타이핑은 구조적 타입 시스템(Structural Type System)이라고 불린다.
    • 실제 구조와 정의에 의해 결정되는 타입 시스템의 한 종류이다.
    • 명시적 선언이나 이름을 기반으로 하는 명목적 타입 시스템(Nominal Type System)인 Java와는 다르다.
    • 런타임에 타입을 체크하는 덕 타이핑과 다르다.
interface Vector2D {
  x: number
  y: number
}
 
interface NamedVector {
  name: string
  x: number
  y: number
}
 
function calculateLength(v: Vector2D) {
  return Math.sqrt(v.x * v.x + v.y * v.y)
}
 
const v: NamedVector = { x: 3, y: 4, name: 'mgh' }
calculateLength(v)
  • 명목적 타입 시스템에서는 Vector2D를 사용하도록 의도한 코드이다.
  • 구조적 타이핑 언어에서는 Vector2D의 속성에 해당하는 값이 값을 넣는 타입에 속성으로 존재하는가? 로 이해 해야한다.
  • 구조적 타이핑은 상속 관계보다는 집합으로 포함한다는 개념을 지향한다.
  • 중복되는 범위가 있다면 재사용이 가능하다.

  • 덕 타이핑과 구조적 타이핑의 차이
    • 덕 타이핑은 런타임에 타입을 체크한다.
    • 구조적 타이핑은 타입 시스템 기반에서 컴파일 타임(타입체커)에서 타입을 체크한다.
    • 객체의 변수, 메소드 같은 필드를 기반으로 타입을 체크하지만 덕 타이핑은 동적 타이핑에서, 구조적 타이핑은 정적 타이핑에서 쓰인다.
    • 덕 타이핑은 다형성 관점에서 주목해야하고, 구조적 타이핑은 타입 체킹 관점이다.

참고