Menu
Coddy logo textTech

덕 타이핑

Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 24번째.

덕 타이핑은 객체가 무엇인지가 아니라, 객체가 무엇을 할 수 있는지에 집중합니다. 만약 객체가 당신이 필요로 하는 메서드를 가지고 있다면, 클래스 타입에 상관없이 그 객체를 사용할 수 있습니다.

여기에 동일한 메서드를 가진 서로 관련 없는 두 개의 클래스가 있습니다:

class Duck:
    def swim(self):
        return "Duck swimming"
    
    def quack(self):
        return "Quack!"

class Person:
    def swim(self):
        return "Person swimming"
    
    def quack(self):
        return "Person imitating a duck: Quack!"

Duck과 Person이 같은 부모 클래스에서 상속받지 않지만, 둘 다 swim()quack() 메서드를 가지고 있다는 점에 유의하세요.

어떤 "오리 같은(duck-like)" 객체와도 작동하는 함수를 만듭니다:

def make_it_swim_and_quack(duck_like_object):
    print(duck_like_object.swim())
    print(duck_like_object.quack())

이 함수는 객체의 타입에는 관심이 없습니다. 오직 객체가 필요한 메서드를 가지고 있는지만 확인합니다.

두 클래스 모두와 함께 함수를 사용하세요:

make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())

출력:

Duck swimming
Quack!
Person swimming
Person imitating a duck: Quack!

또 다른 "오리 같은" 클래스를 추가합니다:

class Robot:
    def swim(self):
        return "Robot swimming with propellers"
    
    def quack(self):
        return "Robot sound: BEEP BEEP!"

make_it_swim_and_quack(Robot())

출력:

Robot swimming with propellers
Robot sound: BEEP BEEP!

핵심 포인트: 덕 타이핑(Duck typing)은 상속 없이도 다형성을 허용합니다. 객체가 필요한 메서드를 가지고 있다면, 그 객체를 사용할 수 있습니다. 이는 파이썬 코드를 유연하게 만들며, "허락을 구하는 것보다 용서를 구하는 것이 쉽다(it's easier to ask forgiveness than permission)"는 원칙을 따릅니다.

challenge icon

챌린지

중급

이 챌린지에서는 다양한 파일 형태의 객체를 사용하여 덕 타이핑(duck typing)을 보여주는 시스템을 구현합니다:

  • textfile.py: read()write(data) 메서드를 가진 TextFile 클래스를 구현하세요
  • database.py: 일치하는 메서드 시그니처를 가진 Database 클래스를 구현하세요
  • networkresource.py: 일치하는 메서드 시그니처를 가진 NetworkResource 클래스를 구현하세요
  • driver.py - 구현이 올바르게 작동하는지 확인하는 테스트 케이스를 구현하세요

각 파일에는 구현을 안내하는 상세한 TODO 주석이 포함되어 있습니다.

치트 시트

덕 타이핑(Duck typing)은 객체가 무엇인지가 아니라, 객체가 무엇을 할 수 있는지에 집중합니다. 만약 어떤 객체가 당신이 필요로 하는 메서드를 가지고 있다면, 그 객체의 클래스 타입에 상관없이 사용할 수 있습니다.

동일한 메서드를 공유하는 서로 관련 없는 클래스들을 사용한 덕 타이핑의 예시입니다:

class Duck:
    def swim(self):
        return "Duck swimming"
    
    def quack(self):
        return "Quack!"

class Person:
    def swim(self):
        return "Person swimming"
    
    def quack(self):
        return "Person imitating a duck: Quack!"

"오리 같은(duck-like)" 객체라면 무엇이든 작동하는 함수를 만들어 보겠습니다:

def make_it_swim_and_quack(duck_like_object):
    print(duck_like_object.swim())
    print(duck_like_object.quack())

# swim()과 quack() 메서드를 가진 객체라면 무엇이든 작동합니다.
make_it_swim_and_quack(Duck())
make_it_swim_and_quack(Person())

덕 타이핑은 상속 없이도 다형성을 가능하게 합니다. 즉, 객체가 필요한 메서드를 가지고 있다면 바로 사용할 수 있습니다. 이는 파이썬 코드를 유연하게 만들며, "허락을 구하는 것보다 용서를 구하는 것이 쉽다(it's easier to ask forgiveness than permission)"는 원칙을 따릅니다.

직접 해보기

# TODO: textfile.py에서 TextFile 클래스를 임포트하세요
# TODO: database.py에서 Database 클래스를 임포트하세요
# TODO: networkresource.py에서 NetworkResource 클래스를 임포트하세요

def process_data(data_source, data):
    # TODO: data_source에서 read() 메서드를 호출하고 결과를 출력하세요
    # TODO: data_source에서 write(data) 메서드를 호출하고 결과를 출력하세요
    pass


# 다양한 데이터 소스로 테스트 - 이 테스트 코드를 수정하지 마세요
text_file = TextFile()
database = Database()
network = NetworkResource()

print("Processing text file:")
process_data(text_file, "Hello, world!")

print("\
Processing database:")
process_data(database, "User record")

print("\
Processing network resource:")
process_data(network, "GET request")
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨