티스토리 뷰

이번에 공부할 내용은 super 입니다. 앞에서 건물 유닛 클래스를 만들 때 pass 로만 남겨두었던 __init__() 생성자의 코드를 완성해보겠습니다. Unit 클래스를 상속받았기 때문에 Unit 의 __init__() 을 활용하면 되는데, 건물은 지상 이동을 할 수 없으므로 speed 정보는 0 으로 하고 다음 줄에서 location 멤버 변수를 정의하겠습니다. (실제 게임에서 테란의 건물들은 날아서 이동이 가능합니다!)

class BuildingUnit(Unit):
    def __init__(self, name, hp, location):
        Unit.__init__(self, name, hp, 0) # speed 0 : 건물은 지상 이동 불가
        self.location = location

 

그런데 가만 생각해보면 우리가 누군가의 부모님을 칭할 때 이름을 직접 부르는 경우는 많지 않습니다. 예를 들어서 주말에 친구들과 놀러가기로 했을 때 "우리 놀러 가는 거 부모님께 허락 받았어?" 라고 물어보지, "OOO님 허락 받았어?" 라고는 하지 않죠.

 

클래스에서도 이와 같이 부모 클래스의 이름을 직접 적지 않고도 부모 클래스에 접근하는 방법이 있습니다. 바로 super() 라는 것인데요. 앞의 코드는 다음과 같이 함으로써 동일한 동작을 수행하게 됩니다. 단, super() 를 사용할 때는 self 를 제외한다는 점을 주의해주셔야 합니다.

class BuildingUnit(Unit):
    def __init__(self, name, hp, location):
        super().__init__(name, hp, 0) # 부모 클래스 접근. self 없이 사용
        self.location = location

 

하지만 부모 클래스를 2개 이상 상속하는 다중상속의 경우에는 어떻게 될까요?

설명을 돕기 위해 새로운 파이썬 파일을 하나 만들어서 다음과 같이 코드를 적어보겠습니다.

class Unit:
    def __init__(self):
        print("Unit 생성자")

class Flyable:
    def __init__(self):
        print("Flyable 생성자")

class FlyableUnit(Unit, Flyable):
    def __init__(self):
        super().__init__()

# 드랍쉽
dropship = FlyableUnit()


일반 유닛인 Unit 클래스와 날아다니는 기능을 하는 Flyable 클래스를 정의했습니다. 그리고 이 둘을 부모 클래스로 하는 공중 유닛인 FlyableUnit 을 정의하고, 생성자에서는 super() 를 통해 부모 클래스의 생성자를 호출하도록 하였습니다.

 

그리고 유닛의 수송을 담당하는 공중 유닛인 드랍쉽을 하나 생성하는 코드를 적고 실행해보면 결과가 이렇습니다.

Unit 생성자

분명 부모 클래스는 Unit 과 Flyable 인데 super() 를 통해 생성자를 호출했을 때 Unit 클래스의 생성자가 호출된 것을 알 수 있네요. 이번에는 부모 클래스의 상속 순서를 Unit, Flyable 에서 Flyable, Unit 으로 바꿔보겠습니다.

# class FlyableUnit(Unit, Flyable):
class FlyableUnit(Flyable, Unit): # 순서 변경
    def __init__(self):
        super().__init__()

다시 실행해보니 이번에는 Flyable 클래스의 생성자가 호출되는 것을 확인할 수 있네요.

Flyable 생성자

 

즉, 다중 상속을 받은 클래스에서 super() 를 통해 부모 클래스로 접근을 할 때는 순서상 가장 먼저 상속받은 클래스로 접근을 하게 됩니다. 그러므로 다중 상속을 할 때 모든 부모 클래스의 생성자를 호출하려면 다음과 같이 명시적으로 각 부모 클래스의 이름을 통해서 접근해야 합니다.

class FlyableUnit(Flyable, Unit):
    def __init__(self):
        # super().__init__()
        Unit.__init__(self) # Unit 클래스 생성자 호출
        Flyable.__init__(self) # Flyable 클래스 생성자 호출

코드를 실행해보면 이번에는 두 부모 클래스의 생성자를 모두 호출하는 것을 확인할 수 있습니다.

Unit 생성자
Flyable 생성자


이번 장에서 새로 작성한 전체 코드입니다.

class Unit:
    def __init__(self):
        print("Unit 생성자")

class Flyable:
    def __init__(self):
        print("Flyable 생성자")
        
# class FlyableUnit(Unit, Flyable):
class FlyableUnit(Flyable, Unit): # 순서 변경
    def __init__(self):
        # super().__init__()
        Unit.__init__(self) # Unit 클래스 생성자 호출
        Flyable.__init__(self) # Flyable 클래스 생성자 호출

# 드랍쉽
dropship = FlyableUnit()
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함