프로필사진

IT Anthology/encyclopedia

[객체 지향 프로그래밍] 상속

다각 2022. 3. 14. 23:27

* 이 글은 코드잇의 <객체 지향 프로그래밍> 코스를 수강하고 정리한 글입니다.
* 나중에라도 제가 참고하기 위해 정리해 두었으며, 모든 내용을 적은 것이 아닌,
필요하다고 생각되는 부분만 추려서 정리한 것임을 미리 밝힙니다.


버거집에서 계산원과 배달원이 있을 경우,

위와 같이 클래스 간에 중복되는 코드가 많다..!!

이때 해결점을 제시할 수 있는 게 바로 상속

상속이란?

: 두 클래스 사이에 부모-자식 관계를 설정하는 것
: 'A는 B다'일 때, A는 자식클래스, B는 부모클래스

여기서 잠깐!! 상속과 관련된 깨알 메소드
(1) 클래스명.mro(): 해당 인스턴스의 클래스가 어떤 부모 클래스를 가지는지 보여줌
(2) isinstance(생성된인스턴스, 클래스명): 첫번째 파라미터의 인스턴스가 두번째 파라미터 클래스의 인스턴스인지 알려줌 (이때 부모 클래스에서도 True 출력!)
(3) issubclass(자식클래스명, 부모클래스명): 첫번째 파라미터의 클래스가 두번째 파라미터의 클래스의 자식 클래스인지 알려줌

오버라이딩

부모 클래스로부터 물려받은(상속받은) 내용을 자식 클래스가 자신에 맞게 변형하여 사용하는 것을 오버라이딩이라고 한다.

이때 겹치는 부분을 다시 적기에는 번거로우니 `super().__init__()`을 통해 간단히 호출할 수 있다.

즉, 자식클래스에서 부모 클래스의 메소드를 사용하고 싶을 때 사용하는 방법은 `super()`

Tip! 오버라이딩이 가능한 이유는?
mro, 즉 method resolution order 대로 자식->부모 순으로 이름이 맞는 메소드를 찾고, 이름이 맞는 메소드를 찾으면 다음 선조로 거슬러가지 않고 메소드 호출...

상속을 사용하면 좋은 점?

비슷한 새로운 클래스를 만들 때 유리 :)

다중 상속

: super()를 쓰면 어느 부모클래스를 칭하는 것인지 알수 없기 때문에, 부모 클래스의 이름을 직접적으로 적어줘야 함


: 다중 상속의 위험성은, 부모클래스의 메소드를 사용할 경우 어느 부모클래스가 우선순위로 들어오게 될지 모호해진다. (물론 .mro()를 사용하면 되지만..) 이 문제 때문에 Java와 같은 경우는 아예 다중상속을 지원하지 않는다..!!
: 따라서 파이썬에서 다중 상속을 할 때는 (1) 부모클래스끼리 같은 이름의 메소드를 갖지 않도록 하거나 (2) 같은 이름의 메소드는 자식클래스에서 오버라이딩 해야지 혼동을 막을 수 있다.