상속을 하는 이유, super를 쓰는 이유

행동하는 개발자·2022년 10월 5일
0

PySide, PyQt

목록 보기
7/20

함수로 동일한 작업을 할 수 있는데 왜 굳이 클래스나 속성, 메소드를 써야 할까

OOP는 그냥 함수 100개가 포함된 .PY파일보다 코드를 훨씬 더 제대로 조직화할 수 있는 유용한 방법이다.

  • 코드 복제는 아예 하지 않는 것이 최선이다.

  • 함수를 수정해야 할 때, 한군데에서만 변경하면 되기 때문이다.

  • 오버라이딩은 무시하다, 우선하다란 뜻으로 말 그대로 기반 클래스의 메소드를 무시하고 새로운 메소드를 만드는 것이다.

  • 자식 클래스의 오버라이드된 메소드는 부모 클래스의 메소드와 유사한 경우가 많다.

  • 이런 중복코드를 방지하기 위해, 내장 super() 함수를 통해 오버라이드된 메소드가 부모 클래스에 속한 원래의 메소드를 호출하게 만들 수 있다.

class ParentClass:
    def priHello(self):
        print("Hello, World")

class ChildClass(ParentClass):
    def someNewMethod(self):
        print("ParentClass object do not have this method")

class GrandC(ChildClass):
    def anotherNewMethod(self):
        print("Only grandchidl")

print()
parent = ParentClass()
parent.priHello()

print()
child = ChildClass()
child.priHello()
child.someNewMethod()

print()
gchild = GrandC()
gchild.priHello()
gchild.someNewMethod()
gchild.anotherNewMethod()

Hello, World

Hello, World
ParentClass object do not have this method

Hello, World
ParentClass object do not have this method
Only grandchidl

다음과 같이 출력되는 것을 확인할 수 있다.

그런데 같은 메소드의 이름을 공유한다면,

class ParentClass:
    def priHello(self):
        print("Hello, World")

class ChildClass(ParentClass):
    def someNewMethod(self):
        print("ParentClass object do not have this method")

class GrandC(ChildClass):
    def anotherNewMethod(self):
        print("Only grandchidl")
    def priHello(self):
        print("i love you")

print()
parent = ParentClass()
parent.priHello()

print()
child = ChildClass()
child.priHello()
child.someNewMethod()

print()
gchild = GrandC()
gchild.priHello()
gchild.someNewMethod()
gchild.anotherNewMethod()

Grandc 의 priHello 가 바뀌었을 때

Hello, World

Hello, World
ParentClass object do not have this method

i love you
ParentClass object do not have this method
Only grandchidl

다음과 같이 hello world 가 i love you로 바뀌는 것을 확인할 수 있다.


class Student:
    def __init__(self, name, age, GPA):
        self.name = name
        self.age = age
        self.GPA = GPA

    def get_name(self):
        print(f'제 이름은 {self.name}입니다.')
    
    def get_age(self):
        print(f'제 나이는 {self.age}세 입니다.')

    def get_GPA(self):
        print(f'제 학점은 {self.GPA}입니다.')

student_a = Student('김OO', 27, 3.4)
student_a.get_name() # 제 이름은 김OO입니다.
student_a.get_age() # 제 나이는 27세 입니다.
student_a.get_GPA() # 제 학점은 3.4입니다.

class Student(Person):
    def __init__(self, name, age, GPA):
        super().__init__(name, age)
        self.GPA = GPA

    def get_GPA(self):
        print(f'제 학점은 {self.GPA}입니다.')

student_a = Student('김OO', 27, 3.4)
student_a.get_name() # 제 이름은 김OO입니다.
student_a.get_age() # 제 나이는 27세 입니다.
student_a.get_GPA() # 제 학점은 3.4입니다.

출처: https://jimmy-ai.tistory.com/79

다음 사이트에서 super init 의 쓰임새를 확인할 수 있다.

profile
끊임없이 뭔가를 남기는 사람

0개의 댓글