
Python으로 코드를 작성하는데, 하도 현업에서 OOP로만 코드를 작성하다보니 코드를 작성할 때에 interface
나 abstract 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할 때에 상속받은 interface
나 abstract class
에 따라 구현이 되어 있지 않으면 오래를 발생시키는 반면, Python은 수행하는 Runtime에 해당 메소드가 없으면 AttributeError
가 발생한다는 큰 차이점이 있었다.
덕타이핑의 장점은?
자바를 사용하다보니 덕타이핑의 장점을 잘 이해를 하지 못했다. '해당 함수가 있고, 없고를 컴파일 시에 알려주는 것이 더 안전한 프로그램이이 아닌가? 런타임에 에러를 발생시키는 것은 위험하지 않나?'하는 생각이 들었다. 지금 생각해보니 객체지향에 사로잡혀서 이런 생각이 든 것 같다.
덕 타이핑을 사용하면 다른 여러 라이브러리에 있는 객체가 해당 함수가 있을 경우(그리고 그 외에 함수들은 다르다 할지라도), 같은 타입이라고 간주하여 프로그래밍을 할 수 있다는 장점이 있다. 따라서 동일한 클래스를 상속받아야만 같은 타입이라고 간주한다는 자바와 다르게 확장성 있게 프로그래밍 할 수 있다는 것이 장점이 있다.
아아주 Python 어린이는 흥미롭습니다.
The end-
Reference
'Python' 카테고리의 다른 글
PyMySQL을 이용하여 Python과 MySQL를 연동하기 (0) | 2022.07.30 |
---|---|
[Python] Dataframe toSql 할 때, unique key로 인한 sqlalchemy.exc.IntegrityError 발생 (0) | 2022.07.29 |