[TS] Duck Typing

개발 log·2022년 1월 9일
0

TS 지식

목록 보기
6/15
post-thumbnail

이 글을 쓰게 된 이유

이전 글에서
"TS는 타입 검사는 값이 있는 형태에 집중한다.
이를 덕 타이핑(duck typing) 또는 구조적 타이핑이라고 불린다."
라고 공식문서에서 언급하는 내용을 인용한 적이 있다.

하지만 값이 있는 형태에 집중한다라는 말이 무슨 말이고
덕 타이핑이란 무엇인지 정확히 알지 못해 궁금해졌고 이러한 궁금증을 해결하고자 이 글을 쓰게 되었다.



덕 타이핑이란?

덕 타이핑을 표현하는 유명한 문구가 있다.

"If it walks like a duck and it quacks like a duck, then it must be a duck"

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

위 말을 프로그래밍 관점에서 해석하자면

만약 어떤 타입이 name이라는 string 타입 프로퍼티가 있고, age라는 number 타입 프로퍼티가 있다면 그것을 Person 타입이라고 볼 것이다.

이 말과 같다.

덕 타이핑은 객체 자신이 어떤 타입인지가 중요한 것이 아닌 특정 메서드나 프로퍼티의 존재로 타입을 판단하는 것이다.

또 반대로는 특정 타입을 정의함으로서 해당 타입을 특정하게 된다.

덕 타이핑은 특정 타입에 얽매이지 않는 어느정도의 자유도를 부여한다.
때문에 타입에 제약없이 보다 유연하게 코드를 작성할 수 있다.

interface Quackable {
  quack(): void
};

class Duck implements Quackable { 
  quack() { 
    console.log('Quack'); 
  }
};

class Person {
  quack() {
    console.log('Quack');
  } 
};

function inTheForest(quackable: Quackable): void { 
  quackable.quack(); 
};

inTheForest(new Duck()); // OK 
inTheForest(new Person()); // OK

위의 예시를 보면 Person 클래스는 Quackable 인터페이스를 구현하지 않은 형태이다.
하지만 TS는 무리 없이 동작 시킨다.

혹시 뭔가 이상한 점을 느끼지 못했는가?

어떻게 Person 클래스는 Quackable 인터페이스를 구현하지 않았는데도 inTheForest함수에서 문제 없이 동작할 수 있었을까?

이러한 행동이 가능하려면 함수 호출 시점에 인자로 넘어오는 값의 타입이 inTheForest함수의 인자로 정의해놓은 quackable: Quackable과 일치하는지 확인해서 타입이 일치한다고 판단되면 통과시켜주는 방식으로 동작해야 할 것이다.

그렇다면 다시 위의 문장을 되짚어보자 함수 호출 시점에 타입을 확인한다는 것은 런타임 시점에 확인한다는 것과 동일한 것으로 해석되고 그렇다면 분명 정적 타입시스템을 적용한 TS의 컨셉과는 맞지 않는 것이 아닌가?

위키에서도 덕 타이핑은 동적 타이핑의 한 종류라고 설명하고 있다.

그렇다면 다시 문장을 정리해보자

정적 타입시스템을 도입한 TS는 덕 타이핑의 특성이 있고
덕 타이핑은 동적 타이핑의 한 종류다.

이게 대체 무슨 소리일까?

마이구미님이 쓰신 글의 내용을 인용해보겠다.

본인의 의문은 결국 타입 검사 측면다형성 측면의 관점을 분리해서 생각하지 않아서 나온 생각이였다.
덕 타이핑은 다형성 측면의 관점으로 볼 수 있다.

타입 검사 측면에서 시점에 따라 동적 타이핑과 정적 타이핑을 구분했던 것을 기억할 것이다.

한가지 정의하고 가자면 TS는 정적 타이핑언어 이다.

이처럼 다형성에도 동적 다형성과 정적 다형성으로 구분이 되는데 이 둘의 특징은 아래와 같다.

동적 다형성

  • 객체의 형태가 런타임 단계에서 결정된다.

  • 동일한 함수 이름과 파라미터 특성을 지닌 상속 관계에 있는 클래스들의 멤버 함수에 대해 외형적으로 호출되는 타입에 상관없이 실제 생성된 객체의 함수가 호출되도록 처리 되는 특성

  • 오버라이딩이라고도 부르므로 오버라이딩을 생각하면 쉽다.

정적 다형성

  • 객체의 형태가 컴파일 단계에서 결정된다.

  • 동일한 함수 이름을 가지더라도 해당 함수가 가지는 파라미터들의 갯수, 타입, 순서가 다를 경우 컴파일러가 다른 함수로 인식 하는 특성

  • 오버로딩이라고도 한다.


정리

정적 타입시스템을 도입한 TS는 덕 타이핑의 특성이 있고
덕 타이핑은 동적 타이핑의 한 종류다.

이 말을 다시 정의하자면 아래와 같다.

TS는 런타임 단계에서 객체의 형태를 결정하는 동적 다형성(덕 타이핑)의 특성으로 정적 타입 시스템을 구축한 컴파일 시점에 타입을 검사하는 정적 타입 언어이다.



참고

[TS] Typescript의 타입 검사
덕 타이핑(Duck typing) 이란? :: 마이구미
Typescript Duck Typing (덕타이핑)

profile
프론트엔드 개발자

0개의 댓글

관련 채용 정보