본문 바로가기

Memo

TS. 덕타이핑

타입스크립트를 공부하면서 Duck typing 이라는 개념이 나와 정리해 보려한다.

간단히 덕 타이핑의 정의를 보자. 위키피디아에서 덕 타이핑을 다음과 같이 정의한다.

컴퓨터 프로그래밍 분야에서 덕 타이핑(duck typing)은 동적 타이핑의 한 종류로, 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것을 말한다. 클래스 상속이나 인터페이스 구현으로 타입을 구분하는 대신, 덕 타이핑은 객체가 어떤 타입에 걸맞은 변수와 메소드를 지니면 객체를 해당 타입에 속하는 것으로 간주한다. “덕 타이핑”이라는 용어는 다음과 같이 표현될 수 있는 덕 테스트에서 유래했다. 

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

 

다음은 '오브젝트' 책에서 기능적인 측면에서 덕 타이핑에 대한 설명이다. 

'루비로 배우는 객체지향 디자인' 이라는 책을 인용해 덕타이핑에 대해 다음과 같은 이야기를 함

객체지향 설계의 목표는 코드의 수정 비용을 줄이는것임. 우리는 애플리케이션 설계의 핵심은 메시지라는 점도 알고 있고 엄격하게 정의된 퍼블릭 인터페이스를 구축하는 과정이 왜 중요한건지도 알고 있음. 이제 이 둘을 통합한 강력한 설계 기술을 연마한다면 수정 비용을 줄일 수 있음. 이 기술의 이름은 덕 타이핑임. 덕 타임은 특정 클래스에 종속되지 않은 퍼블릭 인터페이스이다. 여러 클래스를 가로지르는 이런 인터페이스는 클래스에 대한 값비싼 의존을 메시지에 대한 부드러운 의존으로 대치시킨다. 그리고 애플리케이션을 굉장히 유연하게 만든다.[Metz12]. 

 

단순한 타입 수준에서 다형성을 지원하는 수준을 떠나서 클래스, 인터페이스에 대한 의존도 수준에서 벗어나 메서드 수준으로 타입을 분리할 수 있게 해주는 방식이다.

 

여기서는 타입스크립트를 보면서 잠깐 등장해서 관련 예제만 간단하게 다룰 예정이다.

 

 다음 코드를 보자 이펙티브 자바스크립트 아이템 4에 있는 예시 코드다.

interface Vector2D{
    x:number
    y:number
}

function calculateLength(v:Vector2D){
    return Math.sqrt(v.x*v.x+v.y*v.y)
}

interface NamedVector{
    name:string
    x:number
    y:number
}

const v:NamedVector = {x:3, y:4,name:"Kim"}
console.log(calculateLength(v))

NamedVector 는 number 타입의 x와 y속성이 있기 때문에 calculateLength함수로 호출이 가능하다. Vector2D와 NamedVector 관계가 전혀 선언되지 않았지만 가능하다. 이게 덕 타이핑이다. 

이러한 덕 타이핑 때문에 문제도 발생한다. 다음 코드를 보자 

interface Vector3D{
    x:number, y:number, z:number
}
interface Vector2D{
    x:number, y:number
}
function calculateLength(v:Vector2D) {
    return Math.sqrt(v.x * v.x + v.y * v.y);
}
function normalize(v:Vector3D){
    const length = calculateLength(v)
    return {
        x:v.x /length,
        y:v.y/length,
        z:v.z/length
    }
}

여기서 코드는 잘 실행되지만, 당연히 잘못된 결과가 나온다. 구조적 타이핑 관점에서 x와 y가 있어서 Vector2D와 호환된다. 따라서 오류가 발생하지 않는다. 함수를 작성할 때, 호출에 사용되는 매개변수의 속성들이 매개변수의 입에 선언된 속성만을 가질 거라 생각하기 쉽다. 그리고 이러한 타입은 정확한 타입이라고 불린다. 타입스크립트에서는 정확한 타입으로 표현할 수 없고, 좋든 싫든 타입은 열려 있다고 한다.  

 

몇 가지 예시들이 책에 더 있는데 책에서는 에러라고 뜨는 부분이 실제로 테스트해보면 괜찮은 코드가 있어서 이 부분은 나중에 다시 봐야겠다. 이러한 구조적 타이핑은 테스트 작성할 때 그리고 라이브러리 간의 의존성을 분리할 때 좋다고 한다.

 

참고 및 출처: <이펙티브 타입스크립트> (댄 밴더캄 지음, 장원호 옮김, 인사이트 ,2021), 루비로 배우는 객체지향 디자인 (Sandi Metz 지음, 인사이트, 2014)

https://ko.wikipedia.org/wiki/%EB%8D%95_%ED%83%80%EC%9D%B4%ED%95%91

 

덕 타이핑 - 위키백과, 우리 모두의 백과사전

컴퓨터 프로그래밍 분야에서 덕 타이핑(duck typing)은 동적 타이핑의 한 종류로, 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것을 말한다. 클래스 상속이나 인터페이스 구현으로 타

ko.wikipedia.org

 

 

'Memo' 카테고리의 다른 글

서비스 계층과 도메인 서비스  (0) 2023.10.04
저장소 패턴  (0) 2023.09.29
React. UseMemo, useCallback, React.Memo  (0) 2022.01.22
DI? DIP  (0) 2022.01.17
asm (생각나는 대로 정리중)  (0) 2021.09.25