Python

파이썬 기초문법7 <메소드 오버로딩, pass, super>

sogummi 2023. 3. 23. 01:51

<메소드 오버라이딩(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