이번 글에서는 클래스에 이어서 클래스 상속에 대해서 알아보도록 하겠습니다.
상속
상속은 객체지향 언어에서 매우 중요한 개념 중 하나인데요, 이 상속은 과연 뭘까요?
먼저 '상속'이라는 단어의 뜻을 생각해봅시다.
구글에 검색하면 '상속이란 사람의 사망에 의한 재산 및 신분상의 지위의 포괄적인 승계를 말한다.'라고 나옵니다.
간단하게 말하면 자신의 재산을 다른사람에게 물려주는 것을 이야기합니다.
객체지향 언어에서는 이 개념이 클래스 사이에서 적용될 수 있습니다.
특정한 한 클래스가 다른 클래스에게 자신이 가진 모든 변수와 메서드, 즉 클래스의 기능을 전해주는 것을 '상속'이라고 합니다.
중요한 점은 다른 클래스에게 상속을 해줘도 상속해준 본래 클래스도 계속해서 사용할 수 있다는 점입니다.
말로 설명하면 어려울 수 있으니 바로 코드를 보면서 이야기해보도록 합시다.
일단 상속을 하는 방법은 클래스 정의 시에 클래스 이름 뒤에 (상속받을 클래스명)과 같이 적어주시면 됩니다.
class Parent:
var1 = 10
def __init__(self):
print("Parent클래스 생성")
def fun1(self):
print("fun1")
class Child(Parent):
var2 = 20
c = Child()
print(c.var1)
c.fun1()
print(c.var2)
위의 코드에선 Child라는 클래스가 Parent클래스로부터 상속을 받고 있네요.
그럼 이제 상속을 받았으니 Child클래스에서는 Parent클래스의 기능을 모두 사용할 수 있습니다.
이렇게 Child클래스에서는 정의하지 않았지만 Parent클래스에 정의되어있는 var1변수와 fun1함수에 접근할 수 있습니다.
물론 자기 자신에 정의되어 있는 변수도 당연히 접근할 수 있습니다.
반면, Parent클래스에서는 Child클래스의 기능을 사용할 수 없는데, 뭐 당연한 이야기지요.
그리고 또 중요한 점은 Child클래스 생성 시에 Parent클래스의 생성자 또한 실행된다는 점입니다.
이런 관계를 클래스 간 상속관계라고 하며, 상속을 주는 클래스를 보통 '부모 클래스' 또는 '조상 클래스'라고 부릅니다.
반대로 상속을 받는 클래스는 보통 '자식 클래스' 또는 '자손 클래스'라고 이야기합니다.
위의 코드에서는 Parent가 부모 클래스, Child가 자식 클래스가 되는 거겠죠.
다중 상속
이러한 상속은 꼭 1:1 관계로만 이루어진 것은 아닙니다.
하나의 부모 클래스가 여러 자식 클래스에 상속을 줄 수도 있고, 하나의 자식 클래스가 여러 부모 클래스로부터 상속을 받을 수도 있습니다.
다중 상속이란 위에서 말한 후자, 즉 하나의 자식 클래스가 여러 개의 부모 클래스로부터 상속을 받는 것을 이야기합니다.
class Parent1:
var1 = 10
def __init__(self):
print("Parent1클래스 생성")
def fun1(self):
print("fun1")
class Parent2:
var1 = 20
def __init__(self):
print("Parent2클래스 생성")
class Child(Parent1, Parent2):
var2 = 20
c = Child()
print(c.var1)
c.fun1()
print(c.var2)
다중 상속의 경우 사용법은 그냥 괄호 안에 상속받을 클래스 두 개를 적어주시면 됩니다.
그런데 이때 한 가지 의문점이 생겨납니다.
Parent1클래스와 Parent2클래스에 같은 기능(변수, 메서드)가 있다면 둘 중 어떤 쪽에서 상속을 받게 될까요?
정답은 바로 Parent1클래스 입니다.
그럼 그 이유는 무엇일까요?
흠.. Parent1클래스를 위쪽에 정의했으니까? 비슷하지만 틀립니다.
정답은 클래스 상속 시에 괄호()안에 어떤 순서로 입력했는지에 따라 다릅니다.
두 부모 클래스에 동일한 기능이 존재할 경우 앞에 쓴 기능을 우선적으로 상속받습니다.
위의 코드를 실행시키면 앞에 적은 Parent1클래스에 있는 var1변수를 상속받은 것을 확인할 수 있습니다.
또한 두 클래스의 생성자 또한 앞에 있는 클래스의 생성자만을 상속받습니다.
그럼 코드의 상속받는 부분을 이렇게 바꾸면 어떻게 될까요?
class Child(Parent2, Parent1):
결과를 한번 생각해보시길 바랍니다.
참고로 동일한 이름의 변수나 메서드를 자식 클래스에서 불러올 경우 우선순위는 자식 클래스의 기능이 가장 먼저
우선되고 나머지는 위에서 설명한 바와 같은데, 이와 관련해서 다음 글에서 계속해서 알아보도록 합시다.
이번 글은 이 정도로 마치도록 하겠습니다.
감사합니다.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
파이썬 28. 모듈 (0) | 2020.11.23 |
---|---|
파이썬 27. 메서드 오버라이딩 (0) | 2020.11.19 |
파이썬 25. 클래스-2 (0) | 2020.11.16 |
파이썬 24. 클래스-1 (0) | 2020.11.11 |
파이썬 23. 파일 입출력 (0) | 2020.11.10 |