초보 개발자

24강 상속 본문

Python/윤성우 열혈 파이썬

24강 상속

taehyeki 2022. 1. 18. 11:00

[부모 클래스와 자식 클래스]

 

class A와 class Z가 있고 Z가 A를 상속한다면(받음)  A가 가지고 있는 메서드들을 가지고 오고, 또 새로운 메서드를 추가할 수도이 있다.

 

A클래스   :  부모 클래스, 슈퍼 클래스, 상위클래스

Z클래스   :  자식 클래스, 서브 클래스, 하위 클래스

 


# father_son.py
class Father:
    def run(self):
        print('so fast!')
class Mother:
    def dive(self):
        print('so deep!')
class Son(Father, Mother):
    def jump(self):
        print('so high!!')
def main():
    s = Son()
    s.run()
    s.jump()
    s.dive()
main()

  father와 mother을 동시 상속하는 Son클래스이다.

이렇게 둘 이상의 클래스를 상속하는 것도 가능하지만 구조가 복잡해지고 주의 사항이 늘어나기에 일반적으로는 둘 이상을 동시에 상속하지 않는다. 

 

[메소드 오버라이딩과 super]

 

# father_son.py
class Father:
    def run(self):
        print('so fast! dad style')
class Son(Father, Mother):
    def run(self):
        print(so fast! son style')
def main():
    s = Son()
    s.run()
main()

아빠의 메서드와 아빠를 상속한 아들의 메소드를 보면 같은 것을 알 수 있다.

이 경우 덮어쓴다고 말한다. (오버라이딩) 이 경우 상속받으면 Son객체의 안에 2개의 run 메서드가 존재한다.

 

하나는 물려받은 것, 자신이 정의한 것 여기서 run을 실행하면 아빠의 run은 가려져 Son의 run이 실행이 된다. 

여기서 가려진 부모의 run을 실행하고 싶다면 super().run()이렇게 해주면 실행이된다. super()로 부모의 것을 불러오는 것이다.

그럼 굳이 왜 상속을 받는지 잘 모를 수 있겠지만 이건 기능 보강을 위해서 필요하다.

 

# father_son.py
class Father:
    def run(self):
        print('so fast! dad style')
class Son(Father, Mother):
    def run(self):
        print(so fast! son style')
    def run2(self):
    	super().run() # 부모클래스의 run 호출 방법, 가려진 run 호출 방법!
        
def main():
    s = Son()
    s.run()
    s.run2()
main()

 

[__init__ 메소드의 오버라이딩]

메소드 오버라이딩을 할 수밖에 없으면서 동시에 가려진 메소드를(오버라이딩 된 메소드를)호출해야만 하는 상황이 있이서 이를 소개하려고 한다. 

 

자식 클래스의 의무중 하나는 부모의 변수들을 적절히 초기화 시켜줘야 한다는 것이다.

상속받아서 자식클래스를 생성할 때 자식 클래스의 변수들만 초기화 시켜주면 안되고, 부모의 변수들까지 인자로 받아서 초기화를 같이 시켜주어야 한다는 것이다.

 

부모클래스의 코드를 생략하였다.

class Truck(Car):
	def __init__(self,id,f,c):
    	super().__init__(id,f) # 부모 C의 __init__ 메소드를 호출한다. 
        self.cargo = c

부모의 생성자 함수는 __init__(id,f)일 것이다. 따라서 자식이 이를 적절히 초기화 시켜주어야 된다. 선택이 아니라 필수이다.

 

def show_info(self):
	super().show_info() # Car의 show_info 메소드 호출
    	print( "cargo:", self.cargo)

이 건 부모의 show_info를 사용하고 또 자신이 그 아래에 더 추가해 나가는 예이다. 앞서 기능보강이라고 말한 것이 이러한 것을 의미한다.