멤버함수 오버라이딩
멤버함수 오버라이딩이란 자식 클래스에서 부모의 멤버함수를 덮어쓰는 것이다. 이러면 덮혀써진 부모의 멤버함수는 사라지진 않지만, 호출이 불가능한 상태가 된다.
class ParentClass:
def my_method(self):
print("부모 클래스의 메소드입니다.")
class ChildClass(ParentClass):
def my_method(self):
print("자식 클래스에서 오버라이딩한 메소드입니다.")
# 부모 클래스의 인스턴스 생성
parent = ParentClass()
# 자식 클래스의 인스턴스 생성
child = ChildClass()
# 부모 클래스의 메소드 호출
parent.my_method() # 출력: 부모 클래스의 메소드입니다.
# 자식 클래스에서 오버라이딩한 메소드 호출
child.my_method() # 출력: 자식 클래스에서 오버라이딩한 메소드입니다.
다만 super를 사용해서 덮어쓰여진 부모의 멤버함수를 살려낼 수 있다.
class ParentClass:
def my_method(self):
print("부모 클래스의 메소드입니다.")
class ChildClass(ParentClass):
def my_method(self):
super().my_method() # 부모 클래스의 메소드 호출
print("자식 클래스에서 오버라이딩한 메소드입니다.")
# 자식 클래스의 인스턴스 생성
child = ChildClass()
# 자식 클래스에서 오버라이딩한 메소드 호출
child.my_method()
출력결과
부모 클래스의 메소드입니다.
자식 클래스에서 오버라이딩한 메소드입니다.
부모 클래스를 상속받아 사용할 때를 생각해보자. 자식 클래스는 초기 생성시 __init__함수를 자동으로 실행한다. 이때 부모의 __init__을 오버라이딩해서, 부모클래스에서 필요로하는 값을 넣어주여야한다.
class 부모클래스:
def __init__(self, 변수1, 변수2):
self.변수1 = 변수1
self.변수2 = 변수2
def 출력(self):
print("부모 클래스의 변수1:", self.변수1)
print("부모 클래스의 변수2:", self.변수2)
class 자식클래스(부모클래스):
def __init__(self, 변수1, 변수2, 추가변수):
super().__init__(변수1, 변수2) # 부모 클래스의 __init__ 호출하여 변수1, 변수2 설정
self.추가변수 = 추가변수 # 자식 클래스에서 추가로 설정하는 변수
def 출력(self):
super().출력() # 부모 클래스의 출력 메서드 호출
print("자식 클래스의 추가변수:", self.추가변수)
# 자식 클래스의 인스턴스 생성
자식 = 자식클래스("부모 변수1 값", "부모 변수2 값", "추가 변수 값")
자식.출력()