새소식

반응형
컴퓨터공학 (Computer Science)/프로그래밍언어론 | Programming Language Theory

[OOP 심화] 덕 타이핑 (Duck Typing)에 대한 이해와 고찰 (정의, 실습)

  • -
반응형

1. Question

덕 타이핑이란 OOP에서 사용하는 개념 중 하나이다. 동적 언어 (Dynamic Langauge; 동적 타입)에서 사용하는 개념으로 클래스를 명명하는 것으로 타입을 결정하는 것이 아니라, 객체의 변수 및 메소드의 집합이 객체의 타입을 정하는 것을 의미한다.

어려운가? 일단 덕 타이핑에 대해 한 문장으로 표현한 말을 보도록 하자.

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

이 말은 OOP에서 클래스와 인터페이스로 구분되는 기존 패러다임에서 벗어나, 객체를 미리 판단하지 않고 변수와 메소드가 사용되는 때에 객체를 판단하겠다는 의미이다.

덕 타이핑을 통해 개발자는 함수를 구현할 때 마치 제네릭이 기본인 것 같은 느낌을 받는다. 타입에 대한 자유로운 개발이 큰 장점으로 작용한다.

문제는 유지보수. 덕 타이핑 관련 버그는 해결하기 뭣 같은 걸로 유명하다. 처음에는 당연히 작동하는 것만 주다가 이후 기능을 확장하는 과정에서 이상한거 던져주고는 "이거 왜 안되지" 하고 있는 경우가 허다하다.


2. Practice

간단한 실습을 통해 덕 타이핑을 이해해보자.

다음 코드는 위키피디아의 파이썬 덕 타이핑 예제이다.

class Duck:
    def quack(self): 
        print("꽥꽥!")
    def feathers(self):
        print("오리에게 흰색, 회색 깃털이 있습니다.")

class Person:
    def quack(self): 
        print("이 사람이 오리를 흉내내네요.")
    def feathers(self):
        print("사람은 바닥에서 깃털을 주워서 보여 줍니다.")

def in_the_forest(duck):
    duck.quack()
    duck.feathers()

def game():
    donald = Duck()
    john = Person()
    in_the_forest(donald)
    in_the_forest(john)

이 코드에서 무리 없이 오리와 사람의 quack, feathers 함수가 실행되는 것을 볼 수 있다.

C++ 같은 정적 타입에서 이를 수행하기 위해서는 제네릭을 활용해야 한다.

class Duck {
public:
    void quack() {
        std::cout << "Quaaaaaack!" << std::endl;
    }

    void feathers() {
        std::cout << "The duck has white and gray feathers." << std::endl;
    }
}

class Person {
public:
    void quack() {
        std::cout << "The person imitates a duck." << std::endl;
    }

    void feathers() {
        std::cout << "The person takes a feather from the ground and shows it." << std::endl;
    }
}

template <typename T>
void inTheForest(T& t)
{
    t.quack();
    t.feathers();
}

int main()
{
    Duck donald;
    Person jhon;

    inTheForest( donald );
    inTheForest( jhon );
}

이 경우 제네릭을 생각하고 짜야하기 때문에 해당 문법도 알고 있어야하지만, 이후 기능을 확장할 때 제네릭을 상기시킬 수 있기 때문에 유지보수에 유리해진다.

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.