본문 바로가기
언어/Python

[Python 기본 공부정리] 8-3. 클래스 - 상속(inheritance)

by 민-Zero 2020. 1. 1.

공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다.

틀린 부분에 대한 지적은 감사합니다.

일상적으로 쓰이는 상속이란 뜻은 재산, 지위 등을 물려받는 것을 뜻한다. 클래스에서의 상속도 이와 비슷한 의미로 쓰인다. 만약 클래스B를 만드는대 클래스A와 기본적인 부분은 유사하나 다른 기능 몇 개가 추가되고 기존 기능보다 좀 더 확장된 기능을 가진 클래스라면 A에서 기능을 물려받아 사용할 수 있게 하는 것이다. 간단히 예를 들어 사람이라는 클래스를 만들고 추가로 운동선수라는 클래스를 만들면 사람이 가진 팔, 다리, 걷기, 숨쉬기 등의 공통적인 특징을 물려받아 그대로 사용하고 운동능력이라는 특징을 좀 더 확장시켜 제작하면 운동선수라는 클래스를 쉽게 생성할 수 있다.

 

1. 상속(inheritance)

관용적인 표현으로 클래스의 상속을 표현할 때 상속하는 클래스를 부모 클래스 상속받는 클래스를 자식 클래스라고 한다.

 

문법)

class 자식 클래스명(부모 클래스명):

 

앞에서 예시로든 사람과 운동선수 클래스를 간단하게 생성했다. 우선 Human 클래스를 상속받는 Athlete 클래스는 pass를 입력하여 빈 클래스로 선언하였지만 Human 클래스의 기능들을 모두 물려받았기 때문에 아무런 제약 없이 그대로 가져다가 사용이 가능하다.

 

그렇다면 의문이 생길 수 있다. 왜 기존 클래스 코드 자체를 수정하지 않고 번거롭게 새로운 클래스에 기능을 그대로 가져오고 거기에 기능을 추가하거나 확장시키는 것일까? 이유는 다음과 같은 경우 때문이다.

 

부모 클래스를 기반으로 다양한 자식 클래스를 만드는 경우이다.

위의 예시를 가정하면 운동선수 클래스뿐만 아니라 학생, 교수님, 의사, 화가, 작가, 엔지니어 등 사람에 기반을 둔 다양한 클래스를 만들 때 사람 클래스를 수정하는 방법으로 한다면 일일이 팔, 다리, 숨쉬기 등 모두가 가진 특성을 일일이 다시 작성해야 할 것이다. 이런 경우 상속을 이용하면 훨씬 용이하다.

기존 클래스가 라이브러리 등으로 제공되어 수정이 불가능하다면 상속을 사용해야 변경이 가능하다.

 

2. 오버 라이딩(overriding)

상속의 사용 방법에서는 부모 클래스의 기능을 그대로 가져와 사용하는 것만 보여주었다. 이제 기존의 기능을 확장시키거나 추가하는 방법인 오버 라이딩(overriding)에 대해 정리하자.

overriding 영어 자체를 해석하면 덮어쓴다는 의미이다. 즉, 기존의 같은 이름의 함수를 그대로 가져와 덮어쓴다는 의미이다. 사용 방법은 부모 클래스에 있는 메소드를 그대로 가져와 다시 작성하면 된다.

Athlete 클래스에서 부모 클래스인 Human의 Athletic_ability 메소드를 그대로 가져와 다른 기능을 수행하도록 메소드를 덮어써서 변경하였다. 그래서 상속받은 대로 "보통"을 출력하는 것이 아니라 "뛰어남"을 출력하도록 기능이 변경되었다.

이처럼 오버 로딩을 사용하면 메소드가 덮어써져 아예 기존의 기능이 사라지고 새로운 기능으로 변해버린다. 그렇다면 아예 변경하는 것이 아닌 기존의 기능에서 좀 더 기능이 추가되도록 확장하려면 어떻게 해야 할까?

그때는 부모 클래스의 기능을 다시 한번 작성해야 것이 아니라 super() 키워드를 사용해야 한다. super() 키워드는 자식 클래스에서 부모 클래스를 참조하여 메소드 이름을 가지고 부모 클래스의 메소드를 사용할 수 있게 해 준다.

예시를 통해 확인해 보자.

부모 클래스의 Walk의 "걷기"를 출력하는 기능에 "더 빨리 걷기 가능"이라는 기능을 추가하여 Walk 메소드를 확장하였다. 그냥 오버 로딩만 진행하면 "걷기"에 "더 빨리 걷기 가능"이 덮어써져서 "걷기"는 출력되지 않겠지만 super키워드를 사용하여 부모 클래스 메소드의 기능을 자식 클래스에서도 사용할 수 있게 한다.

 

3. 다중 상속(multiple inheritance)

파이썬은 다중 상속이 가능한 언어이다. 다중 상속은 2개 이상의 클래스를 상속받는 것을 의미한다. 상속의 개수에는 제한이 없으며 여러 부모 클래스중 앞의 클래스의 속성부터 받는다.

문법)

class 자식 클래스명(부모 클래스1, 부모 클래스2, ..):

    멤버

 

클래스명 옆의 괄호에 상속받고자 하는 클래스를 쉼표(,)로 구분하여 여러 개 입력하여 다양한 클래스의 내용을 상속받을 수 있다.

상속받은 모든 부모 클래스의 메소드를 사용할 수 있고 오버 로딩 또한 가능하다.

 

 또한 여러 부모 클래스중 앞의 부모 클래스 속성부터 차례대로 받기 때문에 두 개의 __init__중 A의 생성자를 사용하기 때문에 10, 11이 출력되는 것을 확인할 수 있다.

 

또한 부모 클래스중 먼저 선언된 앞의 클래스의 속성부터 상속받으므로 super() 키워드를 사용하면 동일한 Info 중 A의 메소드를 상속받는 것을 확인할 수 있다. 

댓글