아이템 04. 구조적 타이핑에 익숙해지기

아이템 04. 구조적 타이핑에 익숙해지기

아이템 4. 구조적 타이핑에 익숙해지기 #

자바스크립트는 본질적으로 ‘덕 타이핑(duck typing)’ 기반이다. #

덕타이핑이란?
어떤 값에 필요한 속성, 메서드가 존재한다면 그냥 사용하는 것을 의미한다.

타입스크립트는 자바스크립트의 런타임 동작을 모델링한다.
덕타이핑을 모델링하기 위해 ‘구조적 타이핑’ 기법을 사용한다. (올바른 표현인가…?)

interface Vector2D {
    x: number;
    y: number;
}

interface NamedVector2D {
    name: string;
    x: number;
    y: number;
}

function calculateLength(v: Vector2D) {
    return Math.sqrt(v.x * v.x + v.y * v.y);
}
» tsc example.js
»
» cat example.js
function calculateLength(v) {
    return Math.sqrt(v.x * v.x + v.y * v.y);
}

자바스크립트의 ‘덕타이핑’ 개념이 당여한다는 가정 하에, 타입스크립트의 ‘구조적 타이핑’ 은 어떻게 보면 당연한 것일 수 있다. (위의 코드처럼 .js 로 트랜스파일 이후에 선언된 타입은 모두 제거되기 때문에)



클래스에도 구조적 타이핑이 적용된다. #

class C {
    foo: string;
    constructor(foo: string) {
        this.foo = foo;
    }
}

const c = new C('hi');          // OK
const d: C = { foo: 'hi'; }     // OK (구조적 타이핑에 의해)

console.log(c);                     // C { foo: 'hi' }
console.log(c.constructor);         // [Function: C]
console.log(d);                     // { foo: 'hi' }
console.log(d.constructor);         // [Function: Object]



요약 / 정리 #

1. 자바스크립트가 ‘덕 타이핑’ 기반이고, 타입스크립트가 이를 모델링하기 위해 ‘구조적 타이핑’을 사용한다.

2. 클래스도 구조적 타이핑 규칙을 따른다. 클래스의 인스턴스가 예상과 다를 수 있다.


+ js 에서는 호환성(= 생산성, 다형성, …) 을 중요하게 생각했던 것 같다. (+ 참고 : 덕 타이핑과 구조적 타이핑)

C, Java 등의 정적타입언어에는 엄격한 타입 시스템이 적용되어 있다. 이는 생산성, 접근성 등을 어렵게 하는 요인 중 하나인데, 이 문제를 해결하고자 C++, Java 에서는 다형성을 도입했다. (= 상속, 인터페이스로 이 문제를 해결한 것)

반면에 Javascript 에서는 (이러한 문제에 대해서) 애초에 동적타이핑을 통해 해결하고자 했다. 이 동적타이핑을 통해 자바스크립트에서도 (C, Java에서 표현하는, 다형성이라고 표현하는게 올바른지 모르겠지만) ‘다형성’의 개념이 녹아져있다. 때문에 C, Java에서 말하는 다형성의 이점들(역할, 구현의 분리 등)을 동일하게 사용한다고 볼 수 있을 것 같다.