Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 클래스 상속 완벽 이해하기 – 개념, 문법, 실전 예제

클래스 상속(Inheritance)이란?

파이썬에서는 새로운 클래스를 처음부터 정의하는 대신, 이미 존재하는 클래스를 기반으로 삼아 새로운 클래스를 만들 수 있습니다. 이를 상속(inheritance)이라 하며, 새 클래스 이름 뒤 괄호 안에 부모 클래스(상위 클래스)를 나열하는 방식으로 구현합니다.

이렇게 만들어진 자식 클래스(하위 클래스)는 부모 클래스의 속성과 메서드를 그대로 물려받습니다. 즉, 부모 클래스에 정의된 기능을 마치 자식 클래스 안에 직접 정의한 것처럼 자유롭게 사용할 수 있습니다. 또한 필요에 따라 부모의 데이터 멤버나 메서드를 자식 클래스에서 재정의(오버라이딩, overriding)하여 자신만의 동작으로 바꿀 수도 있습니다.

기본 문법

파생 클래스는 부모 클래스와 거의 같은 방식으로 선언하지만, 클래스 이름 뒤에 상속받을 기반 클래스(base class) 목록을 반드시 명시해야 합니다.

class SubClassName(ParentClass1[, ParentClass2, ...]):
    '선택적인 클래스 문서화 문자열'
    class_suite

참고로 파이썬은 하나의 클래스가 여러 부모 클래스로부터 동시에 상속받는 다중 상속(multiple inheritance)도 지원하며, 이 경우 괄호 안에 부모 클래스들을 쉼표로 구분하여 나열하면 됩니다.

예제 코드

다음 예제는 부모 클래스 Parent와 이를 상속받는 자식 클래스 Child를 정의하고, 자식 객체에서 부모의 기능을 호출하는 과정을 보여줍니다.

#!/usr/bin/python3

class Parent: # 부모 클래스 정의
    parentAttr = 100
    def __init__(self):
        print("Calling parent constructor")
    def parentMethod(self):
        print('Calling parent method')
    def setAttr(self, attr):
        Parent.parentAttr = attr
    def getAttr(self):
        print("Parent attribute :", Parent.parentAttr)

class Child(Parent): # 자식 클래스 정의 (Parent 상속)
    def __init__(self):
        print("Calling child constructor")
    def childMethod(self):
        print('Calling child method')

c = Child() # 자식 클래스의 인스턴스 생성
c.childMethod() # 자식이 자신의 메서드 호출
c.parentMethod() # 부모에게서 상속받은 메서드 호출
c.setAttr(200) # 부모의 메서드를 통해 속성 변경
c.getAttr() # 부모의 메서드를 통해 속성 조회

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Calling child constructor
Calling child method
Calling parent method
Parent attribute : 200

코드 분석

실행 결과를 단계별로 살펴보면 상속의 동작 원리를 더 명확히 이해할 수 있습니다.

  • c = Child(): 자식 인스턴스를 생성하면 자식 클래스의 __init__이 실행되어 'Calling child constructor'가 출력됩니다. 자식 클래스에서 생성자를 재정의했기 때문에 부모의 생성자는 자동으로 호출되지 않습니다.
  • c.childMethod(): 자식 클래스에 직접 정의된 메서드가 호출됩니다.
  • c.parentMethod(): 자식 클래스에는 없지만 부모로부터 상속받았기 때문에 별도의 정의 없이 바로 호출할 수 있습니다.
  • c.setAttr(200)c.getAttr(): 부모의 메서드를 통해 클래스 속성 parentAttr을 변경하고 조회합니다. 상속받은 메서드가 부모 클래스의 데이터 멤버에 그대로 접근할 수 있음을 보여줍니다.

알아두면 좋은 팁

자식 클래스의 생성자에서 부모 클래스의 초기화 로직도 함께 실행하고 싶다면, 파이썬 3에서 제공하는 super().__init__()을 사용하면 됩니다. 이렇게 하면 코드 중복 없이 부모의 초기화 과정을 깔끔하게 재사용할 수 있습니다.