파이썬과 객체지향 프로그래밍 - 다형성(polymorphism)

8. 다형성(polymorphism)

  • 같은 모양의 코드가 다른 동작을 하는 것
  • 키보드의 예로
    • push(keyboard): 키보드를 누룬다는 동일한 코드에 대해
      • ENTER, ESC, A 등 실제 키에 따라 동작이 다른 것을 의미함
  • 다형성은 코드의 양을 줄이고, 여러 객체 타입을 하나의 타입으로 관리가 가능하여 유지보수에 좋음

Method Override (메서드 재정의) 도 다형성의 한 예입니다.

In [209]:
# 클래스 선언
class Person:
    def __init__(self, name):
        self.name = name

    def work(self):
        print (self.name + " works hard")        

class Student(Person):
    def work(self):
        print (self.name + " studies hard")

class Engineer(Person):
    def work(self):
        print (self.name + " develops something")        
In [210]:
# 객체 생성
student1 = Student("Dave")
developer1 = Engineer("David")
student1.work()
developer1.work()
Dave studies hard
David develops something

메서드명을 동일하게 해서 같은 모양의 코드가 다른 동작을 하도록 하는 다형성 예

In [97]:
class SalesWorker:
    def __init__(self, name):
        self.name = name
        
    def work(self):
        print(self.name, 'sells something')
        
class DevWorker:
    def __init__(self, name):
        self.name = name
        
    def work(self):
        print(self.name, 'develops something')
        
worker1 = SalesWorker('Dave')
worker2 = SalesWorker('David')
worker3 = SalesWorker('Andy')
worker4 = DevWorker('Aiden')
worker5 = DevWorker('Tina')
worker6 = DevWorker('Anthony')

workers = [worker1, worker2, worker3, worker4, worker5, worker6]

# 객체 타입에 따라 코드는 동일하나, 실제 호출되는 work 메서드가 다름
for worker in workers:
    worker.work()
Dave sells something
David sells something
Andy sells something
Aiden develops something
Tina develops something
Anthony develops something


초간단 연습10
* 요정(Elf), 파이터(Fighter) 클래스 만들기
- 이름을 입력받음 - Elf의 attack 메서드: 출력 "마법으로 공격합니다."
- Fighter의 attack 메서드: 출력 "주먹으로 공격합니다."
- 다음과 같이 객체 생성 후 반복문으로 공격
elf1 = Elf('Dave')
fighter1 = Fighter('Anthony')
ourteam = [elf1, fighter1]
for attacker in ourteam:
    attacker.attack()
  
In [213]:
class Elf:
    def __init__(self, name):
        self.name = name 
        
    def attack(self):
        print ("마법으로 공격합니다.")

class Fighter:
    def __init__(self, name):
        self.name = name 

    def attack(self):
        print ("주먹으로 공격합니다.")

elf1 = Elf('Dave')
fighter1 = Fighter('Anthony')
ourteam = [elf1, fighter1]
for attacker in ourteam:
    attacker.attack()
마법으로 공격합니다.
주먹으로 공격합니다.