함수로 동일한 작업을 할 수 있는데 왜 굳이 클래스나 속성, 메소드를 써야 할까
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 의 쓰임새를 확인할 수 있다.