개요
객체 지향 프로그래밍과 관련된 개념으로 인터페이스가 존재하는데, 확인해 보니 현재 자주 사용하고 있는 언어인 Python에서는 지원하지 않는 것 같다. 대신 덕 타이핑이라는 개념이 객체 지향 프로그래밍의 인터페이스와 같은 기능을 수행할 수 있다고 한다.
이번 글에서는 덕 타이핑이라는 개념에 대해서 적어두려고 한다.
덕 타이핑
만약 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리면 그 새는 오리일 것이다.
If it walks like a duck, and it quacks like a duck, then it must be a duck.
위의 명제는 오리 실험(The Duck Test)의 명제로, 대상의 습관적인 특성이나 특징을 통해 대상을 식별할 수 있다는 개념을 의미한다.
덕 타이핑이라는 용어는 이런 오리 실험에서 유래하였는데, 컴퓨터 프로그래밍 분야에서 덕 타이핑은 동적 타이핑의 한 종류로, 객체의 변수 및 메서드 집합이 객체의 타입을 결정하는 것을 의미한다. 다른 말로, 객체의 실제 유형이 아니라 특정 메서드나 속성의 존재 여부에 따라 객체의 타입을 판단한다는 것이다.
덕 타이핑은 객체의 타입 자체보다는 객체가 사용되는 양상에 더 초점을 두어야 한다.
덕 타이핑을 지원하지 않는 프로그래밍 언어는 오리라는 타입의 객체를 인자로 받아 걷기, 꽥꽥거리기 등의 메서드를 호출하는 함수를 만들 수 있는 반면, 덕 타이핑을 지원하는 프로그래밍 언어에서는 인자로 받는 객체의 타입을 검사하지 않고 걷기, 꽥꽥거리기 메서드를 호출하는 함수를 만들 수 있다. 메서드를 호출하는 시점에 걷기, 꽥꽥거리기 등의 메서드를 객체가 갖고 있다면 정상적으로 동작하지만, 메서드를 갖고 있지 않으면 런타임 에러를 발생하게 된다.
덕 타이핑은 서로 다른 객체가 특정 메서드를 가지고 있는 경우 같은 타입이라고 간주하여 프로그래밍할 수 있다는 장점을 가진다. 따라서 객체의 타입에 엄격한 언어에 비해 확장성 있게 프로그램을 개발할 수 있다.
예시
간단한 Python 코드로 덕 타이핑의 예시를 들어본다.
먼저 다음과 같이 walk이라는 함수를 가진 Duck 클래스, 그리고 Cat 클래스가 있다고 하자. 두 클래스는 서로 다른 클래스이다.
class Duck:
def walk(self):
print(f'{type(self).__name__} is walking.')
class Cat:
def walk(self):
print(f'{type(self).__name__} is walking.')
그리고 아래와 같이 전달받은 객체의 walk 함수를 호출하는 함수를 정의하여 사용했다고 하자.
def in_the_forest(animal):
animal.walk()
donald = Duck()
tom = Cat()
in_the_forest(donald)
in_the_forest(tom)
서로 다른 타입의 객체이지만 정상적으로 동작한 모습을 확인할 수 있다.
참고 문서
https://velog.io/@msjeong97/Python-duck-typing