달나라 노트

Python Basic : class 상속과 super() 본문

Python/Python Basic

Python Basic : class 상속과 super()

CosmosProject 2020. 11. 29. 17:33
728x90
반응형

 

 

class 상속과 super()

Python의 class를 다룰 때 자주 언급되는 내용이 상속이라는 것인데, 과연 상속이 뭔지에 대해 한번 간단하게 알아봅시다.




먼저 class를 하나 생성해봅시다.

class Parent():
    def father(self):
        print('This is father method.')

    def mother(self):
        print('This is mother method.')

parent = Parent()

parent.father()
parent.mother()

- Output
This is father method.
This is mother method.
  

Parent라는 이름의 class를 선언했고 그 class 안에는 fahter와 mother라는 함수가 존재합니다.

 

그리고 parent라는 변수에 Parent() class를 할당하고 father, mother 함수를 실행시키니 설정했던대로 잘 나오는 것을 알 수 있죠.




그럼 만약에 Child라는 class를 새로 생성하는데 아래 예시처럼 이 class를 생성할 때 만약 인자값으로 Parent를 주게 된다면 어떻게 될까요?

class Parent():
    def father(self):
        print('This is father method.')

    def mother(self):
        print('This is mother method.')


class Child(Parent):
    pass


child = Child()

child.father()
child.mother()

- Output
This is father method.
This is mother method.

뭔가 이상한 점을 느꼈나요?

위에서 Child class를 선언하고 child라는 변수에 Child class를 할당했습니다.

 

또한 Child class 생성 부분을 보면 그냥 pass를 적어놓고 어떠한 기능도 설정하지 않았습니다.

 

근데 child에서 Parent에 있었던 father, mother method를 실행하니 Parent class에서 설정한 것과 똑같은 결과가 나왔습니다.

 

이것이 상속입니다.

 

class Child(Parent): -> 이 부분에서 Child class는 Parent class를 상속받게 되어 Parent class와 동일한 내용을 가지게 됩니다.

사실 단어를 '상속'이라고 해서 좀 어렵게 느껴질수도 있는데 그냥 어떤 class를 생성할 때 다른 class의 내용을 그대로 복사 붙여넣기를 하여 동일한 class를 이름만 다르게 하나 더 생성한다고 생각하면 좀 더 쉬울 것 같습니다.




그러면 class의 상속이란건 왜 있는걸까요?

 

단순히 다른 class와 동일한 class를 생성한다면 굳이 생성할 필요 없이 원본 class 사용하면 되지 않을까요?

 

상속이란 시스템을 이용하는 이유는 여러 가지가 있겠지만,일단 상속을 받은 후에 상속받은 내용을 일부 변경한다던지, 상속받은 내용에 어떤 내용을 추가한다던지 이런 것들이 가능하기 때문에 상속은 꽤나 유용하다는 이유가 있을 수 있겠네요.

class Parent():
    def father(self):
        print('This is father method.')

    def mother(self):
        print('This is mother method.')


class Child(Parent):
    def father(self):
    print('This is child method.')


child = Child()

child.father()
child.mother()

- Output
This is child function.
This is mother function.

위 예시는 Child class에서 father라는 함수를 선언하였습니다.

 

Parent class를 상속받는데 Parent class에 이미 father라는 함수가 있었죠.

 

근데 Child class에서 father라는 동일한 이름의 함수를 선언하고있습니다.

 

이런 경우 Parent class에 있던 father함수는 지워지고 Child class에서 선언한 father 함수가 남아있게됩니다.

 

즉, Parent class에 있던 father함수가 Child class에서 선언된 father함수로 덮어씌워진다는 것이죠.(Overwrite)




또한 아래 예시처럼 Parent class에 존재하지 않던 새로운 함수(또는 변수 등의 기타 내용)를 추가할 수도 있습니다.

class Parent():
    def father(self):
        print('This is father method.')

    def mother(self):
        print('This is mother method.')


class Child(Parent):
    def child(self):
    print('This is child method.')


child = Child()

child.father()
child.mother()
child.child()

- Output
This is child function.
This is mother function.
This is child function.

Parent class를 상속받으면서 Child class 내부에서 child라는 새로운 함수를 선언했죠.

 

그래서 child는 child()라는 함수도 가지게 됩니다.




여기서 한 가지 의문이 생깁니다.

 

만약 아래 예시처럼 Parent로부터 받은 father 함수를 Child class 내에서 덮어씌웠을 때, Parent class에 있는 father 함수를 그대로 사용하고싶으면 어떻게 해야할까요?

 

이때 super 함수가 나오는 것입니다.

ㅁ  
class Parent():
    def father(self):
        print('This is father method.')

    def mother(self):
        print('This is mother method.')


class Child(Parent):
    def father(self):
        print('This is child method.')
    
    def original_father(self):
        super().father()


child = Child()

child.father()
child.original_father()
child.mother()

- Output
This is child function.
This is father function.
This is mother function.

일단 이전 예시에서처럼 Child class에선 Parent class를 상속받았습니다.

 

그리고 father 함수를 새로 선언하여 덮어씌웠죠.

 

한 가지 다른점은 original_father 함수를 Child class내에서 선언하였다는 것입니다.

 

original_father 함수의 내용을 보면 super().father()라고 적혀있는데 이 코드의 의미는 'Child class가 Parent class를 상속받는데 Parent class에 존재하는 원본 father 함수를 가져와'라는 의미입니다.

 

그래서 Output을 보면 original_father라는 함수 호출을 했을 때 This is father function이라는 결과가 나오고 이건 Parent객체의 father함수의 내용과 완전히 동일한 것을 알 수 있죠.

 

지금까지 본 예시들은 class나 함수 자체가 굉장히 간단해서 사실 super()를 사용하는 의미가 크게 없다고 할 수 있습니다.

 

하지만 코드를 작성하거나 Framework등을 쓰다보면 굉장히 복잡한 class 속 복잡한 함수를 내가 원하는대로 일부만 수정해야 할 필요가 있는 경우가 있습니다.

 

이때 class, 함수 등을 처음부터 다시 작성하는게 아니라 super를 통하여 원본 함수를 불러온 후 내가 원하는데로 미세하게 조절해서 사용할 수 있다는 장점이 있습니다.

 

 

 

 

 

 

728x90
반응형
Comments