[Python] 파이썬 클래스 상속(extends) & 예제 총정리

클래스의 주요 특징 중 하나는 바로 '상속'이 된다는 점입니다. 부모 클래스를 자식이 상속받으면 별도의 정의 없이 부모 클래스의 속성과 메서드를 자식 클래스에서 재사용할 수 있습니다. 이번 포스팅에서는 상속을 받으면 얻는 이점과 파이썬에서 클래스를 상속하는 방법에 대해 알아보도록 하겠습니다.

 

 클래스 상속 시 얻는 이점들 

  1. 코드 재사용 : 상속을 통해 부모 클래스의 속성과 메서드를 자식 클래스에서 그대로 재사용할 수 있습니다. 이를 통하여 중복된 코드를 피할 수 있고 소스코드 유지보수가 쉬워집니다.
  2. 확장성 : 자식 클래스는 부모 클래스의 기능을 확장하거나 변경할 수 있습니다. 자식 클래스에 새로운 메서드를 추가하거나 부모 클래스의 메서드를 오버라이드하여 원하는 동작을 재정의할 수 있습니다.
  3. 다형성 : 상속을 통해 클래스의 다형성(polymorphism)을 만족할 수 있습니다. 다형성은 객체가 가질 수 있는 성질이 다양할 수 있다는 것으로 오버로딩, 오버라이딩 등을 통해 자식 클래스 객체가 부모 클래스 타입으로 사용될 수 있고, 객체의 타입에 따라 다른 동작을 할 수 있다는 것을 의미합니다.
  4. 추상화 : 상속을 사용하여 추상 클래스와 추상 메서드를 정의할 수 있습니다. 추상 클래스는 구체적인 구현을 갖지 않는 메서드를 포함하며, 이러한 메서드는 자식 클래스에서 구체적으로 구현하게 됩니다.
  5. 계층 구조 구축 : 클래스 상속을 통해 각 객체간의 계층 구조를 구축할 수 있습니다. 이로써 복잡한 시스템을 계층적으로 구성하고, 객체 간의 관계를 명확하게 정의할 수 있습니다.

 

 파이썬 클래스 상속 방법 

# Animal 클래스 정의
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

# Dog 클래스 정의 - Animal 클래스 상속
class Dog(Animal):
    def speak(self):
        return f"{self.name} says 멍멍!"

# Cat 클래스 정의 - Animal 클래스 상속
class Cat(Animal):
    def speak(self):
        return f"{self.name} says 야옹!"

# Animal 클래스의 인스턴스 생성
animal1 = Animal("동물")
print(animal1.name) 
animal1.speak()  # 아무것도 출력되지 않음

# Dog 클래스의 인스턴스 생성
dog = Dog("멍멍이")
print(dog.name)
print(dog.speak())

# Cat 클래스의 인스턴스 생성
cat = Cat("냥냥이")
print(cat.name)
print(cat.speak())

결과 ↓

동물
멍멍이
멍멍이 says 멍멍!
냥냥이
냥냥이 says 야옹!

 

파이썬에서 클래스를 상속받는 방법은 자식 클래스를 정의할 때, 클래스 헤더 부분의 괄호( ) 안에 상속받을 부모의 클래스를 정의해 주시면 됩니다. 실제로 위의 코드를 돌려보시면 클래스의 상속구조를 이해하시기 편하실 겁니다.

 

위의 예제를 보시면 Animal 클래스는 name 속성과 speak 메서드를 가지고 있습니다. speak 메서드는 구현되지 않았으며, 서브 클래스에서 구현하도록 남겨둡니다. 이후 Dog 클래스와 Cat 클래스는 각각 Animal 클래스를 상속받고, speak 메서드를 오버라이드하여 해당 동물의 소리를 반환합니다. 위와 같이 자식 클래스는 부모 클래스의 속성과 메서드를 그대로 상속받을 수 있고, 필요한 경우 부모 클래스의 메서드를 재정의할 수도 있습니다.

 


 

 파이썬 클래스 상속의 여러 가지 기법들 

메서드 오버라이딩

class Parent:
    def show(self):
        print("부모 메서드")

class Child(Parent):
    def show(self):
        print("자식에서 재정의한 메서드")

child = Child()
child.show() 

결과 : 자식에서 재정의한 메서드

 

위에서 알아본 것처럼 자식 클래스에서 부모 클래스의 메서드를 재정의 할 수 있고 이를 메서드 오버라이딩이라고 합니다. 이를 통해 하위 클래스에서는 상위 클래스의 메서드를 상속받아 동일한 메서드 이름을 사용하여 자신만의 동작을 재정의할 수 있습니다.

 

 

추상 클래스(Abstract Classes)

from abc import ABC, abstractmethod

class Parent(ABC):
    @abstractmethod
    def abstract_method(self):
        pass

class Child(Parent):
    def abstract_method(self):
        print("추상 클래스는 자식 클래스에서 무조건 재정의 해야 함!")

obj = Child()
obj.abstract_method()

결과 : 추상 클래스는 자식 클래스에서 무조건 재정의 해야 함!

 

추상 메서드가 포함되어 있는 클래스를 추상 클래스라고 합니다. 이렇게 추상 클래스를 상속하면 자식 클래스에서는 이 추상 클래스를 반드시 재정의 해야 하기 때문에 코드를 강제할 수 있습니다. 파이썬에서 abc 모듈을 사용하여 추상 클래스를 정의할 수 있습니다.

 

 

부모 클래스의 메서드 호출하기

class Parent:
    def show(self):
        print("super 키워드로 부모 메서드에 접근 가능")

class Child(Parent):
    def show(self):
        super().show()

child = Child()
child.show()

결과 : super 키워드로 부모 메서드에 접근 가능

 

하위 클래스에서 상위 클래스의 메서드를 호출하고 싶을 때는 super() 키워드를 사용하시면 됩니다. 하위 클래스에서 메서드를 오버라이드를 이미 진행했지만 상위 클래스의 메서드를 동작시키고 싶을 때 유용하게 사용할 수 있겠습니다.

 

 

다중 상속(Multiple Inheritance)

class A:
    def method_A(self):
        print("A 클래스의 메서드")

class B:
    def method_B(self):
        print("B 클래스의 메서드")

class C(A, B):
    def method_C(self):
        print("C 클래스의 메서드")

obj = C()
obj.method_A()
obj.method_B()
obj.method_C()

결과 ↓

A 클래스의 메서드
B 클래스의 메서드
C 클래스의 메서드

 

참고로 파이썬은 다중 상속을 지원합니다. 이를 통해 다른 클래스들의 특성들을 조합하여 새로운 클래스를 만드는데 유용하게 사용하실 수 있겠습니다. 위의 예제를 보시면 클래스 C에서 A와 B 클래스를 상속받아 클래스 C에 있는 자신의 메서드 method_C 뿐만이 아니라 A클래스에 있는 method_A, B클래스에 있는 method_B도 호출할 수 있는 것을 확인하실 수 있습니다.

 

 

 

댓글

Designed by JB FACTORY