<메소드 오버라이딩(Method Overriding)>
- 상속 관계에서 자식 클래스가 부모 클래스의 메소드를 상속 받고, 자식 클래스에서 같은 이름의 메소드로 재정의하여 사용하는 것을 의미
class Unit:
def __init__(self, name, hp, speed):
self.name = name # 멤버변수
self.hp = hp # 멤버변수
self.speed = speed
def move(self, location): # 이동함수 정의
print("[지상 유닛 이동]")
print("{0} : {1} 방향으로 이동합니다. [속도 {2}]"\
.format(self.name, location, self.speed))
class AttackUnit(Unit): # 공격 유닛
def __init__(self, name, hp, speed, damage):
Unit.__init__(self, name, hp, speed) # 부모클래스의 생성자 호출
self.damage = damage
class FlyableAttackUnit(AttackUnit, Flyable):
def __init__(self, name, hp, damage, flying_speed):
AttackUnit.__init__(self, name, hp, 0, damage) # 지상 speed : 0
Flyable.__init__(self, flying_speed)
부모 클래스에 speed 멤버변수와 move 메소드를 추가하고, Unit을 상속받고있는 자식 클래스의 __init__()메소드를 사용하는 부분에도 변경해준다. 또한 AttackUnit의 자식클래스인 FlyableAttackUnit클래스도 수정해줘야함 (공중 속도 정의되어 있기 때문에 지상속도 그냥 0으로 지정)
# AttackUnit클래스를 통해 벌쳐 인스턴스 생성
vulture = AttackUnit("벌쳐", 80, 10, 20) # 지상 speed 10
# FlyableAttackUnit클래스를 통해 배틀크루져 인스턴스 생성
battlecruiser = FlyableAttackUnit("배틀크루저", 500, 25, 3)
# 두 클래스는 각각 다른 부모클래스를 상속받기 때문에 이동시키려면 각가 move(), fly() 함수를 이용해야하는 번거로움
#
- 메소드 오버라이딩은 부모 클래스에 정의된 메소드를 자식클래스에서 동일한 이름과 동일한 전달값으로 하여 재정의하면 된다.
class FlyableAttackUnit(AttackUnit, Flyable):
def __init__(self, name, hp, damage, flying_speed): # 이름, 체력, 공격력, 공중 이동 속도
AttackUnit.__init__(self, name, hp, 0, damage) # 이름, 체력, 공격력
Flyable.__init__(self, flying_speed) # 공중 이동 속도
# 발키리 : 공중 공격 유닛, 한번에 14발 미사일 발사.
def move(self, location): # Unit 클래스의 move() 메소드를 새롭게 정의 (오버라이딩)
print("[공중 유닛 이동]")
self.fly(self.name, location)
vulture.move("11시")
# battlecruiser.fly(battlecruiser.name, "9시")
battlecruiser.move("9시") # 오버라이딩된 move() 호출
FlyableAttackUnit의 메소드만 오버라이딩 해주면 되는데 이 클래스는 공중 이동을 하는 유닛이므로 Unit 메소드의 동작만 변경해주면 된다. print로 공중 유닛 이동이라는 문구를 추가하고 self.fly를 통해서 Flyable에 정의된 fly()메소드를 호출한 것임 (* Flyable은 상속받는 부모 클래스 없음 주의)
<pass>
- 아직 구현되지 않은 부분이나 추후 작성할 예정인 부분을 표시할 때 유용
- 아무런 동작을 하지 않지만, 추후에 구현될 부분을 표시하기 위해서 사용
x = int(input("숫자를 입력하세요: "))
if x > 0:
print("안녕")
else: # x가 0보다 같거나 작을 경우 pass
pass
<super>
- 자식 클래스가 상속받은 부모클래스의 메소드를 호출할수 있도록 도와주는 내장 함수
- 보통 자식클래스의 __init__() 메소드에서 사용됨
- 클래스의 MRO에 따라 부모클래스 탐색, 다이아몬드 상속 같은 문제를 해결하기 위한 파이썬의 고급기능
- 다중상속에서 super()함수를 올바르게 사용하기 위해서는 MRO를 이해하는 것이 중요함
*MRO(Method Resolution Order): 클래스가 상속관계를 가질 때, 메소드 호출에 대한 순서를 정하는 것
class Unit:
def __init__(self):
print("Unit 생성자")
class Flyable:
def __init__(self):
print("Flyable 생성자")
class FlyableUnit(Unit, Flyable):
def __init__(self):
super().__init__() #Unit의 init메소드 호출
dropship = FlyableUnit()
#Unit 생성자만 출력
class Parent:
def show(self):
print("Parent's show() method called")
class Child(Parent):
def show(self):
print("Child's show() method called")
super().show()
obj = Child()
obj.show()
#Child's show() method called
#Parent's show() method called