Python 기초 - 11.상속

1 분 소요

상속

객체지향에서의 두 가지 관계형

  • 포함(has a) - 소유. 다른 타입의 객체를 멤버변수로 갖는 것
  • 상속(is a) - 본질. 멤버변수나 메서드를 선언하지 않아도 자신 자체로 상속받는 것

상속, 왜 해야하는가?

  1. 코드 재사용성을 높이기 위해서
  2. 다형성 구현 - 같은 코드를 실행하는 방법에 따라 결과가 달라질 수 있도록 하는 것 (예를 들어 게임에서 캐릭터를 생성할 때 다양한 종족을 선택해도 같은 게임을 할 수 있도록 해주는 것)
  3. 조립형 인터페이스에서의 통일성을 위해

상속 디자인 과정:

도출된 객체와 비슷한 객체들이 발견 ⇒ 공통된 코드를 추출해서 부모 클래스로 정의 ⇒ 비슷한 클래스들을 상속 받아서 정의 (반복되는 멤버변수나 메서드를 매번 쓸 필요가 없어짐)

상속 정의

#부모 클래스 정의
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 : 일반 멤버 변수와 메서드. 클래스 밖에서 보이고 사용가능

댓글남기기