• 덕 타이핑(Duck typing) 이란? :: 마이구미
    Typescript 2020. 2. 23. 19:37
    반응형
    이 글은 덕 타이핑에 대해 다룬다.
    타입스크립트를 통해 다루지만, 덕 타이핑에 관련된 용어는 어느 언어라도 같은 맥락을 가진다.
    참고한 글에는 정말 많은 레퍼런스가 있다. 모두 읽어보면 좋은 글이라 생각한다.
    참고 링크 - https://devopedia.org/duck-typing

     

    알아보기전에, 이해에 도움을 주는 개념들을 알아본다.

    자바스크립트는 타입에 대해 유연한 동적 타입 언어라고 알고 있다.

    그래서 JAVA 와는 다르게 타입에 대해서는 명시적으로 선언없이 자유자재로 사용하고 있다.

     

    // JAVA
    String name = "mygumi";
    
    // Javascript
    const name = "mygumi";

     

    우리는 자바를 정적 타입 언어, 자바스크립트를 동적 타입 언어라고 분류할 수 있다.

    정적은 컴파일 시점, 동적은 런타임 시점에 타입이 체크되어진다고 생각하면 된다.

     

    그리고 정적 타입이 가지는 장점과 동적 타입이 가지는 단점을 보완하는 것이 타입스크립트이다.

    하나의 예로, 즉 타입스크립트는 기존에 자바스크립트가 가지던 런타임에서 오는 이슈들을 컴파일 시점에 알아차릴 수 있다.

     

    간단히 타입스크립트과 자바스크립트를 비교하면 다음과 같다.

     

    // static
    let staticName: string = "mygumi";
    staticName = 1; // TypeError
    
    // dynamic
    let dynamicName = "mygumi";
    dynamicName = 1; // Ok

     

    단순히 여기서 말하고자하는 건, 타입 검사에 대한 컴파일 시점과 런타임 시점이다.

     

    단순 이러한 측면에서 타입스크립트를 바라보고 공부하면서, 본인이 느꼈던 혼란은 아래에서 초래되었다.

    타입스크립트 공식 문서를 보면, 다음과 같이 명시되어있다.

     

    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” 

     

    덕 타이핑에 대해 조금 인지하고 있는 상태에서 본인은 다음과 같이 생각했다.

    위에서 언급했듯이, 타입스크립트는 결국 정적으로 타입을 검사하고 싶어 사용하는 것이 아닌가?

    그런데 덕 타이핑은 어떻게 보면 동적인 성향이 강하지 않나? 라는 의문이 들었다.


    위 문장을 중점으로 돌아가서 공식 문서를 해석해본다.

    타입스크립트의 코어 원리 중 하나는 타입 체킹을 형태(Shape)에 중점을 둔다고 한다.

    그리고 이것을 "덕 타이핑" 또는 "구조적 서브타이핑" 이라고 부를 수 있다고 한다.

    Shape 는 무엇을 나타내는 것이고, 덕 타이핑은 무엇인가?

     

    덕 타이핑은 객체 자신이 어떠한 타입인지가 중요하지 않고, 특정 메소드나 속성의 존재로 타입을 판단한다.

    반대의 경우에는 특정 타입을 정의함으로써, 그 타입을 특정하게 된다.

     

    덕 타이핑은 특정 타입에 얽매이지 않고, 원하는 행동을 할 수 있는 여부로 판단한다.

    그래서 타입에 제약없이 사용하여 보다 유연하게 코드를 작성할 수 있다.

     

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

    덕 타이핑은 다형성 측면의 관점으로 볼 수 있다.

    이것은 널리 알려져 있는 문장의 의미를 내재하고 있다.

     

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

     

    오리처럼 걷고 소리내면 그건 분명 오리라고 결정한다.

    즉, 오리가 아니더라도 오리의 행동을 하면 오리라고 하는것이다.

    타입스크립트 코드로 표현하면 다음과 같다.

     

    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 인터페이스를 구현하지 않은 상태이다.

    하지만 기본적인 동작이 무리없이 통과되는 모습을 볼 수 있다.

     

    https://twitter.com/mmastrac/status/536332443398057984

     

    덕 타이핑은 위 그림처럼 안 좋은 측면에서 보여질 수도 있다.

    결국 타입에 대한 검사가 유연해졌다고 볼 수 있다.

    취향이나 환경에 따라, 명시적으로 타입을 주입해 이러한 경우를 제약하거나 테스트를 통해 신경쓸 필요가 있어보인다. 

    반응형

    'Typescript' 카테고리의 다른 글

    LocalStorage + Typescript :: 마이구미  (0) 2021.10.30

    댓글

Designed by Tistory.