Python 기초 - 11.상속
상속
객체지향에서의 두 가지 관계형
- 포함(has a) - 소유. 다른 타입의 객체를 멤버변수로 갖는 것
- 상속(is a) - 본질. 멤버변수나 메서드를 선언하지 않아도 자신 자체로 상속받는 것
상속, 왜 해야하는가?
- 코드 재사용성을 높이기 위해서
- 다형성 구현 - 같은 코드를 실행하는 방법에 따라 결과가 달라질 수 있도록 하는 것 (예를 들어 게임에서 캐릭터를 생성할 때 다양한 종족을 선택해도 같은 게임을 할 수 있도록 해주는 것)
- 조립형 인터페이스에서의 통일성을 위해
상속 디자인 과정:
도출된 객체와 비슷한 객체들이 발견 ⇒ 공통된 코드를 추출해서 부모 클래스로 정의 ⇒ 비슷한 클래스들을 상속 받아서 정의 (반복되는 멤버변수나 메서드를 매번 쓸 필요가 없어짐)
상속 정의
#부모 클래스 정의
class Parent:
def __init__(self):
self.a = 10
def method1(self):
print('메서드1')
#상속 받을 클래스 정의. #Child는 Parent를 상속받는다 = 부모의 멤버변수와 메서드를 물려받는다
class Child(Parent):
def __init__(self): #super: 부모객체
super.__init__() #부모객체의 생성자 호출
print('Child 생성자)'
self.b = 20 #멤버변수로 a, b 2개를 가짐
def method2(sefl) #메서드로 method1, method2 2개를 가짐
print('메서드2')
예) 학사관리 프로그램을 만들 때
구성원 = 학생, 교수, 교직원 → 3개의 클래스 필요
class 학생 속성: 학번, 이름, 학과, 수강과목, 정보출력
class 교수 속성: 교직원번호, 이름, 학과, 강의과목, 정보출력
class 교직원 속성: 교직원번호, 이름, 부서, 직무, 정보출력
⇒ 번호, 이름, 학과/부서, 정보출력이 공통된다
⇒ 상속을 이용해서 공통된 속성을 부여
메서드 오버라이드
상속 받은 클래스에서 부모 클래스가 준 메서드를 재정의해서 사용하는 경우.
재정의한 메서드의 옛버전을 사용하고 싶은 경우 super().메서드()를 다시 사용
isinstance(obj, class_name):
obj 객체가 class_name으로 만들어진 객체인지 타입을 비교 → True, False
접근제어
클래스의 멤버변수나 메서드를 외부에서 접근하도록 허용할지 여부 지정
-
private : 이름앞에 __를 붙임. 클래스 밖에서 보이지 않고 사용도 불가능. 데이터 은닉성 제공.
⇒ 외부에서 값에 다이렉트로 접근하여 수정하는 것을 방지
- 우회적으로 접근하는 것은 가능
-
public : 일반 멤버 변수와 메서드. 클래스 밖에서 보이고 사용가능
댓글남기기