클래스 상속(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만 넣어서 빈 메서드로 만든 것임
: 왜냐하면 추상 클래스는 인스턴스를 만들 수 없으니 추상 메서드도 호출할 일이 없기 때문
: 추상 클래스는 인스턴슬 만들 때는 사용하지 않으며 오로지 상속에만 사용함
: 그리고 파생 클래스에서 반드시 구혆야 할 메서드를 정해줄 때 사용함