본문 바로가기
programming/Python

파이썬 클래스 상속 super 함수 사용 using python class inheritance super function

by 개코 - 개발과 코딩 2021. 11. 14.

파이썬으로 상속을 사용할 때 super 함수를 사용하면 부모의 모든 것을 상속받을 수 있고, 명시적으로 작성했던 부모클래스명을 작성하지 않아도 된다. 편하다. 아마 귀찮은 개발자들일 경우 super 를 자주 사용하는 분들도 있긴 하다. 사용법은 간단하다. 자식클래스에서 명시적으로 작성한 부모클래스명을 super() 함수로 변경해 주면 주고 self 를 지워주면 된다.

 

파이썬 클래스 상속 super 함수 사용
using python class inheritance super function

파이썬에서 클래스를 상속받을 때 자식클래스는 부모클래스의 이름을 명시적으로 작성해야 했다.

하지만, 이를 대체할 수단이 있다.

간편할 수도 있다.

부모클래스의 이름을 몰라도 상속에 문제는 없으면 부모클래스의 클래스 변수와 클래스 함수 등을 모조리 씹어? 아니 상속받을 수 있다.

그 역할을 하는 것이 super 함수이다.

super() 함수

자바나 C# 에도 존재하는 super 함수는 자식클래스가 부모클래스를 상속받을 때 사용한다.

부모클래스가 여러 개 있을 때나 혹은 부모클래스의 이름이 수시로 바뀔 때 super 함수를 사용하면 편하다.

부모가 누군지도 모르고 자식은 부모의 유전자를 물려받는 셈이다.

복수극 영화도 아니고 뭐 그렇다고 하자.

사용법

super 함수를 사용하는 것은 편하다.

이미 알고 있던 상속하는 방법에서 명시적으로 작성했던 부모클래스명을 super 로 변경만 해 주면 된다.

추가적으로 self 라 명명되었던 부분은 필요가 없어진다.

왜?

위에서 비유적으로 설명했지만, 자식은 부모가 누군지도 모르고 특성을 모두 상속받는다.

즉, 내부적으로 상속을 받기 위해 부모클래스를 인자값으로 받은 자식 클래스는 자동적으로 상속받는 구조이기 때문이다.

명시적일 필요가 없다는 말과 같다.

print('----------')

#- 클래스부분
class ParentClass : #-{

    def __init__(this, property) : #-{
        this.PROPERTY = property
    #-}

#-}

class ChildClass(ParentClass) : #-{

    def __init__(this, property) : #-{
        
        super().__init__(property)
        
    #-}         

#-}

샘플코드

이전에 병사와 관련한 클래스를 만들어 파이썬 상속에 대한 연습을 해보았다.

이번에 그 코드를 변경하여 super 함수를 사용하여 상속을 받을 것이다.

자식클래스는 상속을 위해 부모클래스를 인자값으로 받았다는 것과 부모클래스를 초기화할 때 self 가 필요 없다는 것에 주목하자.

print('----------')

#- 클래스부분
class ParentClass : #-{

    def __init__(this, soldier, hp, weapon, fire) : #-{
        this.SOLDIER = soldier
        this.HP = hp
        this.WEAPON = weapon
        this.FIRE = fire
    #-}

#-}

class ChildClass(ParentClass) : #-{

    def __init__(this, soldier, hp, weapon, fire) : #-{
        
        #- ParentClass.__init__(this, soldier, hp, weapon, fire)
        super().__init__(soldier, hp, weapon, fire)
        
    #-}
    
    def DisplayInfo(this) :  #-{
        
        vValue = this.SOLDIER
        print("군인", type(vValue), vValue);
       
        vValue = this.HP
        print("체력", type(vValue), vValue);

        vValue = this.WEAPON
        print("무기", type(vValue), vValue);

        vValue = this.FIRE
        print("공격력", type(vValue), vValue);
 
    #-}
         

#-}

print('----------')

vCls1 = ChildClass("소총수", 100, "GUN", "10")
vCls1.DisplayInfo();

print('----------')

vCls2 = ChildClass("저격수", 50, "SNIPER", "50")
vCls2.DisplayInfo();

print('----------')

vCls3 = ChildClass("포격수", 10, "BOMBER", "100")
vCls3.DisplayInfo();

print('----------')

다 필요없다.

상속받는 자식클래스에서 주석친 부분을 보도록 하자.

자식클래스는 부모클래스를 상속하기 위해 인자값으로 받고 있다.

명시적으로 상속받아 부모클래스를 초기화 하는 부분과 susper 함수를 사용하여 초기화하는 부분만 주목하면 된다.

self 가 없다. 하지만 부모의 속성과 메서드는 모조리 상속받은 것과 같다..

결과화면을 보자.

결과 또한 이전에 포스팅한 내용과 차이는 없다.

반응형

댓글