본문으로 바로가기

클래스 상속 사용하기

category Python/python 2020. 10. 19. 23:50

클래스 상속(inheritance)

 : 물려받은 기능은 유지한 채로 다르 ㄴ기능을 추가할 때 사용하는 기능

 : 여기서 기능을 물려주는 클래스를 기반 클래스(base class)

   상속 받아 새롭게 만드는 클래스를 파생 클래스(derived calss)라고 함

 

 : 보통 기반 클래스는 부모 클래스(parent class), 슈퍼 클래스(super클래스)라고 부르고

   파생 클래스는 자식 클래스(child class), 서브 클래스(subclass)라고 부름

 

class 기반 클래스 이름:
	코드

class 파생 클래스 이름(기반 클래스 이름):
	코드

 : Student클래스에는 greeting 메서드가 없지만 Person 클래스를 상속받았으므로 greeting메서드를 호출할 수 있음

   - 부모의 것을 내 것처럼 사용 가능

 

상속 관계 확인하기

 : 클래스가 기반 클래스의 파생 클래스인지 확인

 : 기반 클래스의 파생 클래스가 맞으면 True, 아니면 False를 반환

issubclass(파생클래스, 기반클래스)

 

상속 관계

 : 상속은 명확하게 같은 종류이며 동등한 관계일 때 사용함

 : 상속 관계는 영어로 'is-a' 관계라고 부름

 : 즉, "학생은 사람이다."라고 했을 때 말이 되면 동등한 관계

 

포함 관계

 : 동등한 관계가 아니라 포함 관계

 : 즉, "사람 목록은 사람을 가지고 있다"라고 말할 수 있음

 : 그래서 포함 관계를 영어로 'has-a' 관계라고 부름

 

기반 클래스 속성 사용하기

: 파생 클래스에서 기반 클래스의 속성을 출력하려고 하면 에러가 발생함

 

 : super()로 기반 클래스 초기화하기

   - super()를 통해서 기반 클래스의 __init__ 메서드를 호출해줌

super().메서드()

   - Person의 __init__을 호출해주면서 기반 클래스가 초기화 되어 속성이 만들어짐

 

 : 기반 클래스를 초기화하지 않아도 되는 경우

   - 파생 클래스에 __init__ 메서드가 없다면 기반 클래스의 __init__이 자동으로 호출됨

 

좀 더 명확하게 super 사용하기

super(파생클래스, self).메서드

 

 

메서드 오버라이딩(Method Overriding)

 : 파생 클래스에서 기반 클래스의 메서드를 새로 정의

 

 : Person의 greeting 메서드가 있는 상태에서 Student에도 greeting 메서드를 만듦

 : 오버라이딩은 무시하다, 우선하다라는 뜻이 있는데 말 그대로

   기반 클래스의 메서드를 무시하고 새로운 메서드를 만든다는 뜻

 

 : 보통 프로그램에서 어떤 기능이 같은 메서드 이름으로 계속 사용되어야 할 때 메서드 오버라이딩을 활용함

 : 기반 클래스의 메서드를 재활용하면 '안녕하세요.'의 중복을 줄일 수 있음

 

 : 중복되는 기능은 파생 클래스에서 다시 만들지 않고 기반 클래스의 기능을 사용하면 됨

 : 메서드 오버라이딩은 원래 기능을 유지하면서 새로운 기능을 덧붙일 때 사용함

 

 

다중 상속 사용하기

: 클래스를 만들 때 (괄호)안에 클래스 이름을 ,(콤마)로 구분해서 넣음

class 기반클래스1:
	코드

class 기반클래스2:
	코드

class 파생클래스(기반클래스1, 기반클래스2):
	코드

 

다이아몬드 상속

 : 기반 클래스 A가 있고, B, C는 A를 상속 받음

 : 그리고 다시 D는 B, C를 상속받음

다이아몬드 상속

 : 객체지향 프로그래밍에서는 이런 상속 관계를 다이아몬드 상속이라 부름

 : 프로그래밍에서는 이렇게 명확하지 않고 애매한 상태를 좋아하지 않음

 

 : 메서드 탐색 순서 확인하기

클래스.mro()

 : 파이썬은 다중 상속을 한다면 왼쪽에서 오른쪽 순서로 메서드를 찾음

 

 

object 클래스

 : 파이썬에서 object는 모든 클래스의 조상임

 

 : 모든 클래스는 object 클래스를 상속받으므로 기본적으로 object를 생략함

 : 괄호 안에 object를 넣은 것과 같음

 

 

추상 클래스(abstract class)

 : 파이썬은 추상 클래스라는 기능을 제공함

 : 메서드의 목록만 가진 클래스

 : 상속 받는 클래스에서 메서드를 구현을 강제하기 위해 사용

 

 : 추상 클래스를 만드려면 import로 abc(abstract base class) 모듈을 가져와야함 

 : 그리고 클래스의 (괄호) 안에 metaclass=ABCMeta를 지정

 : 메서드를 만들 때 위에 @abstractmethod를 붙여서 추상 메서드로 지정

from abc import *

class 추상클래스(metaclass=ABCMeta):
	@abstractmethod
    def 메서드이름(self):
    	코드

 

 : 추상클래스를 상속받은 클래스는 모든 추상 메서드를 구현해야 함

 

 : 모든 추상 메서드 구현

 

추상 클래스를 빈 메서드로 만드는 이유

 : 추상 클래스는 인스턴스로 만들 수가 없다

 

 : 추상 클래스를 StudentBase로 인스턴스를 만들면 에러가 발생함

 : 그래서 지금까지 추상 메서드를 만들 때 pass만 넣어서 빈 메서드로 만든 것임

 : 왜냐하면 추상 클래스는 인스턴스를 만들 수 없으니 추상 메서드도 호출할 일이 없기 때문

 

 : 추상 클래스는 인스턴슬 만들 때는 사용하지 않으며 오로지 상속에만 사용함

 : 그리고 파생 클래스에서 반드시 구혆야 할 메서드를 정해줄 때 사용함

 

반응형

'Python > python' 카테고리의 다른 글

Python을 이용한 데이터 시각화  (0) 2020.11.03
예외 처리 사용하기  (0) 2020.10.20
클래스 속성과 정적, 클래스 메서드 사용하기  (0) 2020.10.19
클래스  (0) 2020.10.19
클로저 사용하기  (0) 2020.10.19