kimddakki 2022. 6. 14. 12:54
Duck Typing
interface People {
  talk(): void;
  whoAmI: string;
}

class Human implements People {
  whoAmI = "human";
  talk = () => {
    console.log(`say ${this.whoAmI} : 말할 수 있어요`);
  };
}

class Robot {
  whoAmI = "robot";
  talk = () => {
    console.log(`say ${this.whoAmI}: 말할 수 있어요`);
  };
}

const humanInstance = new Human();
const robotInstance = new Robot();

const startTalk = (people: People): void => {
  people.talk();
};

startTalk(humanInstance); // human : 말할 수 있어요
startTalk(robotInstance); // robot : 말할 수 있어요

 Case 1 ) startTalk( humanInstance )의 경우 에러가 예상되지 않았다.

 

 - Class Human은 Interface People을 상속받아 생성되었으며 

   humanInstance는 Class Humna의 Instance 이기 때문이다.

  => 즉 함수 startTalk의 파라미터 people이 정의된 타입대로 호출되었다.

       파라미터 people은 interface People로 정의되어 있다.

 

Case 2 ) 파라미터로 들어간 robotInstance는 Interface People로 정의되어 있지 않아 에러가 날 거 같았다.

 

 - 하지만 이 시점에서 타입스크립트의 Duck Typing 개념이 적용된다.

 

 - Class Robot은 Class Human이 정의된 대로 변수 whoAmI와 메소드 talk를 모두 가지고 있다.

 

 - Interface People을 상속받지 않았지만

   Interface People이 가지고 있는 property를 모두 가지고 있으므로 타입 체크를 통과하게 되는 것이다.

 

타입스크립트의 interface 문서

One of TypeScript’s core principles is that type checking focuses on the shape that values have. 
This is sometimes called “duck typing” or “structural subtyping”.
In TypeScript, interfaces fill the role of naming these types, 
and are a powerful way of defining contracts within your code as well as contracts with code outside of your project.

 - 타입스크립트에서의 타입 체크는 shape에 집중하고 있고 이를 Duck Typing 혹은 Stuctural Subtyping 이라고 정의한다

 

Duck Typing

 - 덕 타이핑이란 컴퓨터 프로그래밍 분야에서 동적 타이핑의 한 종류로 객체의 변수 및 메소드의 집합이 객체의 타입을

   결정하는 것을 말한다.

 - 클래스 상속이나 인터페이스 구현으로 타입을 구분하는 대신 덕 타이핑은 객체가 어떤 타입에 걸맞은 변수와 메소드를

   지니면 객체를 해당 타입에 속하는 걸로 간주하는 것이다.

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

 

 - 타입스크립트의 Duck Typing 특성 때문에, Case 2와 같은 정의된 타입이 아니더라도 정의된 타입과 같은 shape을 

   가지고 있게 된다면 타입 체크에서는 에러가 나오지 않게 되는 것이다!!

 

 정적인 TypeScript 동적인 Duck Typing...
https://mygumi.tistory.com/367

 - JavaScript는 동적 타입의 언어로서 유연한 언어라는 점이 장점이라 언급되지만 예측할 수 없는 에러를 발생시킨다는

   단점을 항상 수반하게 된다.

 - 그렇기 때문에 TypeScript가 JavaScript의 정적 타이핑을 지원하기 위해 등장하게 된 것이다.

 

 - 하지만 정적 타이핑을 지원하는 TypeScript가 Duck Typing의 특성이 있고 Duck Typing은 동적 타이핑의 

   한 종류라고 하니 혼란을 유발하게 된다.

https://mygumi.tistory.com/367

 - 타입 ( Data의 형태 )를 컴파일 단계에서 결정하면 정적 타이핑이라고 하고, 런타임 단계에서 결정하면 

   동적 타이핑이라고 한다.

 

 - TypeScript는 타입 검사를 런타임 단계가 아닌 컴파일 단계에서 진행하므로

   => 즉 타입 검사 측면에서 타입스크립트를 보면 타입스크립트는 정적 타이핑이다.라고 말할 수 있는 것이다.

 

OOP의 다형성의 정의

1. 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.
2. 하나의 객체가 여러 개의 자료형 타입을 가질 수 있다.

 

 - 다형성이란 " 여러 가지 형태( Data 타입 )를 가지고 있다 "라고 이해하면 된다.

 

 - 다형성 역시 정적 다형성, 동적 다형성으로 구분할 수 있다.

정적 다형성은 컴파일 타임 바인딩을 의미하며, 동적 다형성은 런타임 바인딩을 의미합니다.

보통 객체 지향 언어에서 정적 다형성을 overloading이라고 하며, 동적 다형성을 overriding이라고 부릅니다.

정적 다형성(혹은 overloading)은 동일한 함수 이름을 가지더라도 해당 함수가 가지는 파라미터들의 개수, 타입, 순서가 
다를 경우 컴파일러가 다른 함수로써 인식 하는 것을 의미합니다.

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


다형성의 이런 특성(=동적)에 의해 객체 지향 프로그래밍에서는 ‘동일한 인터페이스의 여러 객체,
동일한 객체의 여러 인터페이스’를 갖는 것이 가능합니다.

 - 어떤 객체의 형태가 컴파일 단계에서 결정된다면 ' 정적 다형성 ', 런타임 단계에서 결정된다면 ' 동적 다형성 ' 이다.

  => 여기서 말하는 객체란 class 내의 method라고 생각하면 이해하기가 쉽다.

 

 - 타입스크립트는 컴파일 단계에서 실제로 지정된 Type인지 아닌지를 판단하지 않는다.

   대신 런타임 단계에서 지정된 Type이 가지고 있는 변수와 method가 있는지 판단하고 없다면 에러가 발생된다.

 => 즉 TypeScript는 런타임 단계에서 객체가 어떤 형태를 지니고 있는지 판단하는 동적 다형성 혹은 덕 타이핑의 

      특성을 지니고 있다.

 

TypeScript의 정적 타이핑은 타입 검사 측면에서 해석한 결과이며
TypeScript의 동적 타이핑인 Duck Typying은 다형성의 측면에서 해석한 결과이다.

 => 이렇기 때문에 TypeScript를 정적, 동적이라는 상반된 개념을 연관 지었을 수 있다.

 

 

Typescript Duck Typing (덕타이핑)

타입스크립트의 인터페이스에 대한 글을 읽다가 Duck Typing에 대해 알게되었다. 먼저 코드로 개념을 이해해보자. (위의 코드는 [Typesrcipt playground](https://www.typescriptlang.org/play?#code/JYOwLgpg

velog.io

 

 

덕 타이핑(Duck typing) 이란? :: 마이구미

이 글은 덕 타이핑에 대해 다룬다. 타입스크립트를 통해 다루지만, 덕 타이핑에 관련된 용어는 어느 언어라도 같은 맥락을 가진다. 참고한 글에는 정말 많은 레퍼런스가 있다. 모두 읽어보면 좋

mygumi.tistory.com