Python으로 코드를 작성하는데, 하도 현업에서 OOP로만 코드를 작성하다보니 코드를 작성할 때에 interfaceabstract class와 비슷한 구문을 계속해서 찾기 시작했다.
그런데 작성하다보니 Java처럼 작성할 수 없고, 한계점도 들어나고 했다.

 

 

 

 

 

덕타이핑이란?


그래서 알아보니 Python과 같은 동적타입의 언어의 성질과는 다르다는 것을 알 수 있었다.

Python에서는 덕타이핑(duck typing) 이라는 개념을 사용한다.
아래의 내용을 참고하면 된다.

“If it walks like a duck, and it quacks like a duck, then it must be a duck.” (There are other variations).

즉, Python은 본질적으로 다른클래스라도 객체의 실제 유형이 아니라 특정 메소드와 속성의 존재 여부에 따라 결정된다는 것이다.

예제를 위키피디아에서 가져왔다.

class Duck:
    def swim(self):
        print("Duck swimming")

    def fly(self):
        print("Duck flying")

class Whale:
    def swim(self):
        print("Whale swimming")

for animal in [Duck(), Whale()]:
    animal.swim()
    animal.fly()

위의 코드 내용을 수행하면 결과가 아래와 같다.

Duck swimming
Duck flying
Whale swimming
AttributeError: 'Whale' object has no attribute 'fly'

따라서, Java의 경우에는 compile할 때에 상속받은 interfaceabstract class에 따라 구현이 되어 있지 않으면 오래를 발생시키는 반면, Python은 수행하는 Runtime에 해당 메소드가 없으면 AttributeError가 발생한다는 큰 차이점이 있었다.

 

 

 

 

덕타이핑의 장점은?

자바를 사용하다보니 덕타이핑의 장점을 잘 이해를 하지 못했다. '해당 함수가 있고, 없고를 컴파일 시에 알려주는 것이 더 안전한 프로그램이이 아닌가? 런타임에 에러를 발생시키는 것은 위험하지 않나?'하는 생각이 들었다. 지금 생각해보니 객체지향에 사로잡혀서 이런 생각이 든 것 같다. 

 

덕 타이핑을 사용하면 다른 여러 라이브러리에 있는 객체가 해당 함수가 있을 경우(그리고 그 외에 함수들은 다르다 할지라도), 같은 타입이라고 간주하여 프로그래밍을 할 수 있다는 장점이 있다. 따라서 동일한 클래스를 상속받아야만 같은 타입이라고 간주한다는 자바와 다르게 확장성 있게 프로그래밍 할 수 있다는 것이 장점이 있다. 

 

 

아아주 Python 어린이는 흥미롭습니다. 

 

The end-

Reference

Duck Typing - Christopher Bailey
Duck Typing - Wikidocs

반응형
복사했습니다!