컴퓨터공학 (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 );
}
이 경우 제네릭을 생각하고 짜야하기 때문에 해당 문법도 알고 있어야하지만, 이후 기능을 확장할 때 제네릭을 상기시킬 수 있기 때문에 유지보수에 유리해진다.