DINO NET
(23.02.03) 객체 지향 프로그래밍 기본 개념 3. 상속(Inheritance) 본문
상속(Inheritance)
두 클래스 사이에 부모-자식 관계를 설정하는 것.
A, B 모두가 클래스라 가정하면, <A는 B다> 라는 명제는 성립하고 <B는 A다>라는 명제가 성립이 되지 않을 때, A는 B에 속해 있는 형태이고 이는 'A가 B에 상속되었다'라고 말할 수 있다.
클래스 끼리의 상속은 다음과 같이 표현할 수 있다.
class 자식_클래스(부모_클래스):
특성
- 자식 클래스는 부모 클래스의 모든 변수와 메소드를 물려받는다.
- 중복되는 변수와 메소드를 상속 받음으로써 중복을 최소화할 수 있다.
- 자식 클래스는 부모 클래스의 변수와 메소드를 오버라이딩을 통해 수정이 가능하다.
오버라이딩
부모 클래스로부터 물려 받은 변수, 메소드를 자식 클래스에 맞게 수정하는 것.
자식 클래스에 물려받은 메소드(변수)와 동일한 메소드(변수)를 적고 맞게 수정하면 된다.
class Parents:
def __init__(self, a, b):
self.a = a
self.b = b
class Child(Parents):
def __init__(self, a, b, c):
Parents.__init__(self, a, b) #super().__init__(a, b)
#self.a = a
#self.b = b
self.c = c
예제 속 Child 클래스와 Parents 클래스는 상속 관계이다. 그러므로 Child 클래스는 Parents의 변수와 메소드를 공유 가능.
__init__ 메소드를 Child에서 오버라이딩 하였다.
- self.a = a 와 self.b = b는 중복되는 내용이므로 Parents.__init__(self, a, b)와 같이 표현할 수 있다.
- Parents.__init__(self, a, b)는 super().__init__(a, b)와 같이 표현 가능한데, 이 때 super()는 부모 클래스의 메소드를 호출한다. super()에서는 self가 빠진다.
- __init__ 속 c는 자식 클래스 내에서 새로 정의 되었으므로 원하는 대로 정의하면 된다.
즉, 오버라이딩은
class 자식_클래스:
def __init__(self, a, b, c):
부모_클래스.__init__(self, a, b)
# 혹은 super().__init__(a, b)
self.c = c
와 같이 표현 가능한 것이다. 이는 비단 __init__ 뿐만 아니라 이름은 같으나, 수정하고자 하는 내용이 있으면 자식 클래스에서 그대로 같은 이름을 이용해 수정하면 된다.
이는, 자식 클래스의 인스턴스가 메소드나 변수를 호출할 때, 주체가 되는 자식 class가 우선시 되는 셈인데 그 이유는 mro()를 통해서 알 수가 있다.
mro() 함수
Method Resolution Order의 약자로 클래스에 상속 관계를 나열해주는 함수이다.
클래스_이름.mro()
mro()를 호출하면 상속 관계가 나열 되는데, 그 순서가 <자식 class> <부모 class> ... 등등 자식 -> 부모 순으로 나열 된다. 즉, 인스턴스가 메소드나 변수를 호출할 때, 검색 기준이 mro()에 나열된 순서이므로 자식 class가 우선되는 것이다.
그 외 상속과 관련된 함수
1. isinstance(): 검사할 인스턴스가 기준 클래스의 인스턴스인지 판정
isinstance(검사할_인스턴스, 기준_클래스)
#boolean값 리턴
*자식 클래스로 만든 인스턴스는 부모 클래스의 인스턴스이기도 하다. (다형성)
2. issubclass(): 검사할 클래스가 기준 클래스의 자식 클래스인지 판정
issubclass(검사할_클래스, 기준_부모_클래스)
#boolean값 리턴
다중상속
하나의 자식 클래스가 여러 부모 클래스를 상속 가능
class 자식_클래스(부모1, 부모2):
[부모 1] -(상속)-> [자식_클래스] <-(상속)- [부모 2] 구도로 상속을 한다.
단점:
1. super()를 썼을 때, 어느 부모를 상속 받는지 모른다.(부모_클래스.메소드() 방식으로 사용) -> 상속의 주체가 모호해진다.
2. class 자식_클래스(부모1, 부모2)와 class 자식_클래스(부모2, 부모1)는 상속받는 우선순위가 변한다. -> mro()에 기재되는 순서가 달라지기 때문
해결방법:
1. 부모 클래스들끼리 같은 이름의 메소드를 갖지 않는다.
2. 같은 이름의 메소드는 자식 쪽에서 오버라이딩 하기.

'program() > 파이썬' 카테고리의 다른 글
| SOLID - 1. Single Responsibility Principle (단일 책임 원칙) (0) | 2023.02.07 |
|---|---|
| (23.02.06) 객체 지향 프로그래밍 기본 개념 4. 다형성(Polymorphism) (0) | 2023.02.06 |
| (23.02.03) 객체 지향 프로그래밍 기본 개념 2. 캡슐화(Encapsulation) (0) | 2023.02.03 |
| (23.02.02) 객체 지향 프로그래밍 기본 개념 1. 추상화(Abstraction) (0) | 2023.02.02 |
| (23.02.01) 실습 (0) | 2023.02.02 |