클래스는 일종의 범주(category) 처럼 작동하며
클래스가 가지는 기본적인 속성들이 있었고
특정 변수를 클래스에 일원으로 선언하는 인스턴스.
클래스 내에서 작동하는 함수인 메서드,
클래스 기본 속성만으로 작동하는 정적 메서드,
인스턴스에 인수를 전달하면서 클래스 속성을 변경하는
클래스 메서드가 있었다.
보통 클래스를 하나 만들어두면, 미리 저장된 속성등을
이용해 다양한 기능들을 편리하게 활용할 수 있기 때문에
클래스는 그대로 두면서 새로운 클래스를 만들어
다양한 메서드들을 편하게 사용하기 위해
클래스간 상속을 활용하게 된다.
기반 클래스 -> 파생 클래스
상속은 자신의 속성을 완전히 물려주므로
is-a관계 = 완전 같은 동등한 관계라고 하고
부분집합인 경우 리스트 속성에 인스턴스를 넣어서
관리하면 되므로 has-a관계(포함관계)라고 한다.
기반 클래스의 속성은 파생 클래스에서도 사용 가능하지만
기반클래스와 파생클래스 모두에게 init이 있다면,
기반클래스의 init 을 호출하지 못하기 때문에
super().init을 통해 기반클래스의 메서드를
호출하도록 해야한다.
상속할때 파생클래스에서 메서드를 새로 정의하서나
추가할 수도 있는데, 이를 메서드 오버라이딩이라고 한다.
그냥 메서드를 새로 정의하는 경우 파생클래스의 메서드만,
super를 사용하는 경우 기반클래스의 메서드를 실행후에
파생클래스의 메서드를 실행하도록 할 수 있다.
하나의 클래스에서 상속을 받을 때도 있지만
종종 여러 클래스에서 상속을 받을 때도 있다.
상속
상속의 상속,
상속의 상속의 상속,
계속 이렇게 하다보면 어디서 꼬일 가능성이 높아지는데
이때를 위해 Method Resolution Order(MRO)를 통해
메서드 탐색순서를 확인 할 수 있다.
추상클래스는 인스턴스를 가지지 않고,
메서드만 가지고 있는 클래스로
상속시켜서 메서드만 다른 클래스에서 사용하도록 한다.