덕 타이핑과 구조적 타이핑

김명일·2023년 3월 13일
2

타입스크립트

목록 보기
1/2

덕 타이핑과 구조적 타이핑

자바스크립트는 덕타이핑기반이다.

덕 타이핑이란?

만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 오리라고 부를 것이다.

즉, 전달받은 객체가 어떻게 만들어졌는지 상관없이 원하는 값을 가지고 있다면 신경쓰지 않는다는것을 의미한다.

아래 예제를 보면 DuckAirplane은 둘다 fly메소드를 가지고 있다. 하지만 fly메소드는 인터페이스를 구현하거나 상속받은 것이 아니다. 서로 가지고 있을 뿐이다.
runFly()는 인자로 전달받은 객체의 fly메소드를 실행하는 메소드이다. 전달받은 값은 Duck인지, Airplane인지 중요하지 않다. 그냥 fly메소드가 있으면 된다.

class Duck {
  fly() {
    console.log('펄럭펄럭');
  }
}

class Airplane {
  fly() {
    console.log("슈우우웅~");
  }
}

function runFly(target) {
  target.fly();
}

const duck = new Duck();
const airplane = new Airplane();

runFly(duck);
runFly(airplane);

타입스크립트는 이런 자바스크립트의 덕타이핑 특성을 고려해 구조적 타이핑을 택했다.

구조적 타이핑(Structual Typing)이란, 말그대로 구조를 보고 타입을 체크하겠다는 것을 의미한다.

즉, 구조적으로 필요한 값을 모두가지고 있다면 해당 타입이 될 수 있다.

runFly() 메소드에 필요한 파라미터 타입은 fly: () => void 를 갖고있는 객체이다. 따라서 DuckAirplane 모두 해당 타입이 될 수 있다. 심지어 target의 타입을 Duck 으로 정의하더라도 airplane을 인자로 줄 수 있다.

class Duck {
  fly(): void {
    console.log('펄럭펄럭');
  }
}

class Airplane {
  fly(): void {
    console.log("슈우우웅~");
  }
}

function runFly(target: {fly: () => void}) {
  target.fly();
}

const duck = new Duck();
const airplane = new Airplane();

runFly(duck);
runFly(airplane);

반대의 의미로 명시적 타이핑이 있다. 명시적 타이핑은 객체가 어떻게 생성되었는가에 관심을 갖는다. 구조적으로 같더라도 명시된 타입이 다르다면 다른 타입으로 본다. 예로 Java가 있다. Java는 다른 객체가 같은 구조를 갖더라도 다른 타입으로 본다.

참고)
이펙티브 타입스크립트

profile
주니어 백엔드 🐶🦶🏻📏

0개의 댓글