36.1 사람 클래스로 학생 클래스 만들기

Unit 36. 클래스 상속 사용하기

지금까지 클래스의 기본적인 사용 방법을 알아보았습니다. 이번에는 클래스 상속(inheritance)을 사용해보겠습니다.

상속은 무언가를 물려받는다는 뜻입니다. 그래서 클래스 상속은 물려받은 기능을 유지한채로 다른 기능을 추가할 때 사용하는 기능입니다. 여기서 기능을 물려주는 클래스를 기반 클래스(base class), 상속을 받아 새롭게 만드는 클래스를 파생 클래스(derived class)라고 합니다.

그림 36-1 클래스 상속

보통 기반 클래스는 부모 클래스(parent class), 슈퍼 클래스(superclass)라고 부르고, 파생 클래스는 자식 클래스(child class), 서브 클래스(subclass)라고도 부릅니다.

클래스 상속은 생물 분류를 떠올리면 이해하기 쉽습니다. 예를 들어 조류, 어류는 공통된 조상인 척추동물로부터 물려받은 특성을 공유하면서 각자 고유한 특성을 가집니다. 척추를 가졌다는 특성은 변함이 없지만 날개를 가졌으면 조류, 물속에 살면 어류인 식입니다. 즉, 같은 계통으로 특성을 공유하며 전혀 상관없이 어류가 꽃식물의 특성을 가지지는 않습니다.

그림 36-2 생물 분류

마찬가지로 클래스 상속도 기반 클래스의 능력을 그대로 활용하면서 새로운 클래스를 만들 때 사용합니다. 동물을 예로 들면 척추동물에서 포유류, 조류, 파충류 등을 만드는 식이죠.

그런데 그냥 새로운 클래스를 만들면 되지 왜 이런 상속 개념을 만들었을까요? 만약 새로운 기능이 필요할 때마다 계속 클래스를 만든다면 중복되는 부분을 반복해서 만들어야 합니다. 이럴 때 상속을 사용하면 중복되는 기능을 만들지 않아도 됩니다. 따라서 상속은 기존 기능을 재사용할 수 있어서 효율적입니다.

36.1 사람 클래스로 학생 클래스 만들기

클래스 상속은 다음과 같이 클래스를 만들 때 ( )(괄호)를 붙이고 안에 기반 클래스 이름을 넣습니다.

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

그럼 간단하게 사람 클래스를 만들고 사람 클래스를 상속받아 학생 클래스를 만들어보겠습니다.

class_inheritance.py

class Person:
    def greeting(self):
        print('안녕하세요.')
 
class Student(Person):
    def study(self):
        print('공부하기')
 
james = Student()
james.greeting()    # 안녕하세요.: 기반 클래스 Person의 메서드 호출
james.study()       # 공부하기: 파생 클래스 Student에 추가한 study 메서드

실행 결과

안녕하세요.
공부하기

Student 클래스를 만들 때 class Student(Person):과 같이 ( )(괄호) 안에 기반 클래스인 Person 클래스를 넣었습니다. 이렇게 하면 Person 클래스의 기능을 물려받은 Student 클래스가 됩니다.

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

james = Student()
james.greeting()    # 안녕하세요.: 기반 클래스 Person의 메서드 호출

그리고 Student 클래스에 추가한 새로운 메서드인 study를 호출했습니다.

james.study()       # 공부하기: 파생 클래스 Student에 추가한 study 메서드

Person 클래스와 Student 클래스의 관계를 그림으로 나타내면 다음과 같은 모양이 됩니다.

그림 36-3 클래스 상속과 메서드 추가

이처럼 클래스 상속은 기반 클래스의 기능을 유지하면서 새로운 기능을 추가할 수 있습니다. 특히 클래스 상속은 연관되면서 동등한 기능일 때 사용합니다. 즉, 학생은 사람이므로 연관된 개념이고, 학생은 사람에서 역할만 확장되었을 뿐 동등한 개념입니다.

참고 | 상속 관계 확인하기

클래스의 상속 관계를 확인하고 싶을 때는 issubclass 함수를 사용합니다. 즉, 클래스가 기반 클래스의 파생 클래스인지 확인합니다. 기반 클래스의 파생 클래스가 맞으면 True, 아니면 False를 반환합니다.

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

>>> class Person:
...     pass
...
>>> class Student(Person):
...     pass
...
>>> issubclass(Student, Person)
True

StudentPerson의 파생 클래스이므로 issubclassTrue가 나옵니다.