개요
2024.04.22-[Python] 클래스와 생성자에서 객체 지향 프로그래밍을 위한 클래스와 생성자에 대해 정리해 두었는데, 이번 글에서는 상속과 관련된 문법을 정리해두려고 한다.
상속
'재산을 상속받다.'라는 문장에서 사용된 의미와 동일하게, 객체 지향 프로그래밍에서도 상속은 물려받다는 의미로 사용된다. 다만 재산이 아닌 클래스를 정의할 때 다른 클래스의 기능을 물려받는 것을 상속이라고 한다. 달리 말해 이미 만들어진 클래스를 재사용하여 다른 클래스를 생성하는 것을 말한다.
상속을 사용하면 기존 클래스를 변경하지 않으면서 새로운 속성과 메서드를 추가할 수 있고, 기존 메서드를 다시 정의하여 기능을 변경할 수 있다.
상속받는 클래스를 자식 클래스(Child Class, Sub Class)라고 하고, 상속의 대상이 되는 클래스를 부모 클래스(Parent Class, Super Class)라고 말한다.
기존에 사용하는 클래스에 대해 수정이나 확장이 필요한데, 라이브러리 형태로 제공되고 있거나 수정을 허용하지 않을 때 사용을 고려할 수 있다.
기본 문법
상속
클래스를 상속할 때는 클래스 정의 시 괄호에 부모 클래스를 전달해 주면 된다.
class ClassName(ParentClass):
pass
예시 )
class Character():
def __init__(self):
self.life = 1000
class Warrior(Character):
pass
print(Warrior.mro())
클래스에 대한 상속 정보는 메서드 결정 순서를 출력하는 mro(Method Resolution Order) 함수를 사용하여 확인할 수 있다.
위의 Warrior 클래스는 Character 클래스를 상속 받았기 때문에 Warrior, Character, object 클래스 순으로 출력되는 모습을 확인할 수 있다. 참고로 Python의 모든 클래스는 object 클래스를 상속받는다.
생성자
자식 클래스의 생성자 __init__을 정의할 때는 생성자 내에서 부모 클래스의 생성자를 호출해주어야 한다. 자식 클래스 내에서 super 키워드를 사용하여 부모 클래스를 참조할 수 있다.
class ClassName(ParentClass):
def __init__(self, attr1, attr2):
super().__init__(attr1)
self.attr2 = attr2
예시 )
아래 예시는 Character 클래스를 상속받은 Warrior 클래스에 추가 속성을 초기화하는 생성자를 정의한 것이다.
class Character():
def __init__(self):
self.life = 1000
class Warrior(Character):
def __init__(self):
super().__init__()
self.strength = 15
self.intelligence = 5
peter = Warrior()
print(peter.life, peter.strength, peter.intelligence)
확인해 보면 peter라는 객체에 life, strength, intelligenct 속성 모두 초기화된 것을 볼 수 있다.
메서드 오버라이딩
메서드 오버라이딩(method overriding)이란, 부모 클래스에서 정의한 메서드를 자식 클래스에서 재정의한 것을 의미한다. 호출하면 부모 클래스의 메서드가 아니라 자식 클래스에서 재정의한 메서드가 호출된다.
자식 클래스에서 __init__ 함수를 재정의하는 것도 메서드 오버라이딩에 해당된다.