Programing Language/Python

추상 클래스와 덕 타이핑

JHeaon 2023. 9. 6. 10:59

최근 디자인 패턴을 공부하면서 Java언어의 예제를 자주 접하다 보니 파이썬에도 추상 클래스와 인터페이스에 대한 개념이 있지 않을까 해서 관련 정보를 찾아보고 정리하였다. 그중에 나온 개념이 파이썬에서 사용하는 추상클래스와 덕 타이핑이라는 개념인데 이를 공부하고 정리해 보았다. 

 

추상 클래스

파이썬은 추상 클래스(abstract class)를 제공한다. 추상 클래스란 구현 내용이 없고 메서드 목록만 가진 클래스이다. 추상클래스 자체로는 인스턴스화가 불가능하며, 클래스의 메서드를 상속받는 파생 클래스에게 구현하도록 강제하기 위해 사용된다.

 

파이선에서 추상 클래스를 사용하기 위해서는 ABC클래스와 @abstractmethod을 임포트 하여야 한다. 

from abc import *
class 추상클래스명(metaclass=ABCMeta):

     @abstractmethod
        def 추상메소드(self):
            pass

추상 메서드는 생략하면 기본적인 클래스는 동작하지만, 추상 메서드를 추가한 후에 객체를 생성하면 에러가 발생한다. 

아래는 추상 메서드를 구현하지 않았을 때 나온 예제이다. 

from abc import *
 
class StudentBase(metaclass=ABCMeta):
    @abstractmethod
    def study(self):
        pass
 
    @abstractmethod
    def go_to_school(self):
        pass
 
class Student(StudentBase):
    def study(self):
        print('공부하기')
 
james = Student()
james.study()

===================
Traceback (most recent call last):
  File "C:\project\class_abc_error.py", line 16, in <module>
    james = Student()
TypeError: Can't instantiate abstract class Student with abstract methods go_to_school

 

추상 클래스를 상속받았다면 @abstractmethod가 붙은 추상 메서드를 모두 구현하여야 한다. 따라서 아래와 같이 Student에서 go_to_school 메서드를 구현하여야 한다. 

 

from abc import *
 
class StudentBase(metaclass=ABCMeta):
    @abstractmethod
    def study(self):
        pass
 
    @abstractmethod
    def go_to_school(self):
        pass
 
class Student(StudentBase):
    def study(self):
        print('공부하기')
 
    def go_to_school(self):
        print('학교가기')
 
james = Student()
james.study()
james.go_to_school()

 

 

덕 타이핑

'If it walks like a duck and it quacks like a duck, then it must be a duck' 해석해 보면 '오리처럼 걷고, 오리처럼 꽥꽥거리면, 그것은 틀림없이 오리다.'라는 뜻이다. 파이썬과 같은 동적 타입의 언어에서는 본질적으로 다른 클래스라도 객체의 적합성은 객체의 실제 유형이 아닌 특정 메서드와 속성의 존재에 의해 결정되는 것을 의미한다. 

 

아래는 덕 타이핑에 대한 예제이다. 

 

class Duck():
    def sound(self):
        print('꽥꽥')
    
class Dog():
    def sound(self):
        print('멍멍')
        
class Fish():
    def swim(self):
        print('헤엄')
        
def get_sound(animal):
    animal.sound()
    
duck = Duck()
dog = Dog()
fish = Fish()

get_sound(duck) # 꽥꽥
get_sound(dog) # 멍멍
get_sound(fish) # 에러발생! (AttributeError)

 

클래스 내부에 동일한 메서드가 있는 것만으로 get_sound에서 정상적으로 호출되는 것을 볼 수 있으며, Fish 같은 경우에는 메서드가 존재하지 않기 때문에 AttributeError가 발생한다. 즉 속성과 메서드의 존재에 의해 객체의 적합성이 결정된다고 볼 수 있다. 


참고 

https://wikidocs.net/16075

 

45. class 정리 - 추상클래스(abstract class)

## 1. 추상클래스(abstarct class)란 - 추상클래스란 미구현 추상메소드를 한개 이상 가지며, 자식클래스에서 해당 추상 메소드를 반드시 구현하도록 강제합니다. - …

wikidocs.net

https://dev-jy.tistory.com/29

 

[Python] Duck Typing?

파이썬은 덕타이핑을 지원하는 언어라는 말을 많이 들어봤는데 덕타이핑이 뭐지?? Duck Typing - If it walks like a duck and it quacks like a duck, then it must be a duck 해석해보면 "오리처럼 걷고, 오리처럼 꽥꽥

dev-jy.tistory.com

https://nesoy.github.io/articles/2018-02/Duck-Typing

 

덕 타이핑(Duck Typing)이란?

 

nesoy.github.io

 

'Programing Language/Python'의 다른글

  • 현재글 추상 클래스와 덕 타이핑

관련글