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

파이썬(Python) 클래스와 상속 완벽 가이드: 코드 재사용의 핵심

객체 지향 프로그래밍과 상속이란?

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 프로젝트 전반에서 코드 중복을 방지하기 위해 재사용 가능한 코드 패턴을 만드는 프로그래밍 패러다임입니다. 재사용 가능한 코드를 만드는 대표적인 방법 중 하나가 바로 상속(Inheritance)으로, 하나의 하위 클래스가 다른 기반 클래스의 코드를 활용하는 것을 말합니다.

상속이란 한 클래스가 다른 클래스 안에 작성된 코드를 그대로 가져다 사용할 수 있도록 하는 기능입니다.

자식 클래스(child class) 또는 서브클래스(subclass)라고 불리는 클래스는 부모 클래스(parent class) 또는 베이스 클래스(base class)로부터 메서드와 변수를 물려받습니다.

Child 서브클래스가 Parent 베이스 클래스를 상속하기 때문에, Child 클래스는 Parent의 코드를 그대로 재사용할 수 있습니다. 덕분에 프로그래머는 더 적은 줄의 코드로 동일한 기능을 구현할 수 있고, 코드 중복도 크게 줄어듭니다.

상속 클래스 선언 문법

파생 클래스(derived class)는 부모 클래스와 거의 같은 방식으로 선언합니다. 다만 클래스 이름 뒤에 상속받을 베이스 클래스 목록을 괄호로 명시한다는 점이 다릅니다.

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

다른 객체 지향 언어와 비교했을 때 파이썬의 상속은 몇 가지 뚜렷한 특징을 가집니다.

  • 상속은 클래스 정의 시 괄호 안에 부모 클래스 이름을 나열하는 것만으로 간단히 구현됩니다.
  • 여러 개의 부모 클래스를 동시에 지정하는 다중 상속(multiple inheritance)도 지원합니다.
  • 자식 클래스는 부모 클래스의 모든 속성과 메서드를 그대로 사용할 수 있으며, 필요에 따라 오버라이딩(재정의)할 수도 있습니다.

상속 예제

다음은 부모 클래스와 자식 클래스를 정의하고 상속 관계를 확인하는 예제입니다. (Python 3 기준 문법)

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

코드 분석

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

  1. c = Child() — Child 클래스의 인스턴스를 생성하면 Child가 자체적으로 정의한 생성자(__init__)가 호출되어 "Calling child constructor"가 출력됩니다. 자식 클래스에서 생성자를 재정의했기 때문에 부모의 생성자는 자동으로 호출되지 않습니다.
  2. c.childMethod() — Child 클래스에 직접 정의된 메서드가 실행됩니다.
  3. c.parentMethod() — Child에는 존재하지 않는 메서드지만, Parent를 상속했기 때문에 부모 클래스의 메서드를 그대로 호출할 수 있습니다.
  4. c.setAttr(200), c.getAttr() — 마찬가지로 상속받은 부모 클래스의 메서드를 사용해 속성 값을 변경하고 조회하며, 최종적으로 200이 출력됩니다.

이처럼 상속을 활용하면 부모 클래스에서 이미 작성된 기능을 자식 클래스가 그대로 물려받아 사용할 수 있습니다. 결과적으로 코드의 재사용성이 높아지고, 중복이 줄어들며, 유지보수도 한결 쉬워집니다. 상속은 파이썬 객체 지향 프로그래밍의 핵심 개념이므로, 다양한 예제를 통해 반드시 익혀두는 것이 좋습니다.