1. Ducl Typing 이란?
Duck typing이란 특히 동적 타입을 가지는 프로그래밍 언어에서 많이 사용되는 개념으로, 객체의 실제 타입보다는 객체의 변수와 메소드가 그 객체의 적합성을 결정하는 것을 의미한다. Duck typing이라는 용어는 흔히 duck test라고 불리는 한 구절에서 유래됐다.
If it walks like a duck and it quacks like a duck, then it must be a duck.
만일 그 새가 오리처럼 걷고, 오리처럼 꽥꽥거린다면 그 새는 오리일 것이다.
동적 타입 언어인 파이썬은 메소드 호출이나 변수 접근시 타입 검사를 하지 않으므로 duck typing을 넒은 범위에서 활용할 수 있다. 다음은 간단한 duck typing의 예시다.
class Parrot:
def fly(self):
print("Parrot flying")
class Airplane:
def fly(self):
print("Airplane flying")
class Whale:
def swim(self):
print("Whale swimming")
def lift_off(entity):
entity.fly()
parrot = Parrot()
airplane = Airplane()
whale = Whale()
lift_off(parrot) # prints `Parrot flying`
lift_off(airplane) # prints `Airplane flying`
lift_off(whale) # Throws the error `'Whale' object has no attribute 'fly'`
- https://en.wikipedia.org/wiki/Duck_typing 예제 코드를 발췌하였다.
- Parrot 클래스와 Airplane 클래스는 분명 서로 상속되거나 하는 그런 관계는 없다, 다만 내부에 동일한 메소드의 fly()메소드가 있는 것만으로 호출하는 `lift_off(entity)' 함수에서 fly가 정상적으로 실행된다.
- 마지막 Whale 클래스는 해당 fly() 메소드가 없기 때문에, AttributeError가 발생한다.
- 속성과 메소드 존재에 의해 객체의 적합성이 결정된다.
Python에서는 다양한 곳에서 duck typing을 활용한다. __len__()을 구현하여 길이가 있는 무언가 를 표현한다던지 (흔히 listy하다고 표현한다), 또는 __iter__() 와 __getitem__() 을 구현하여 iterable을 duck-typing한다. 굳이 Iterable (가명) 이라는 interface를 상속받지 않고 __iter__()와 __getitem__()을 구현하기만 하면 for ... in 에서 바로 사용할 수 있다.
이와 같은 방식은 일반적으로 interface를 구현하거나 클래스를 상속하는 방식으로 인자나 변수의 적합성을 runtime 이전에 판단하는 정적 타입 언어들과 비교된다.
참고 자료
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Python#Duck-Typing
'Python' 카테고리의 다른 글
Passed-By-Assignment (0) | 2022.02.18 |
---|---|
property (함수/데코레이터)[파이썬/python] (0) | 2022.02.17 |
메모리 누수[파이썬/python] (0) | 2022.02.17 |
GC(Garbage Collection) (0) | 2022.02.16 |
GIL(Global Interpreter Lock) (0) | 2022.02.16 |
댓글