개발

파이썬: 상속(Inheritance)이란?

Funital01 2026. 4. 10. 18:03
목차

1. 상속(Inheritance)

2. 오버라이딩(Override)

3. super()

 

상속(Inheritance)

“상속”이라는 단어는 어떤 것을 물려받는다는 의미를 가지고 있습니다.

프로그래밍에서의 상속 또한 비슷한 개념으로, 기존 클래스의 기능을 그대로 물려받아 재사용하는 것을 의미하죠.

 

파이썬은 객체지향 프로그래밍(OOP)을 지원하는 언어이고,

캡슐화, 상속, 다형성, 추상화라는 주요 특징을 가지고 있습니다.

여기서 상속은 공통적인 특성은 재사용하고 고유 특성만 따로 추가를 하자 라는 기능으로 사용이 됩니다.

 

즉, 상속을 사용하면 부모 클래스의 속성과 메서드를 자식 클래스가 그대로 물려받을 수 있습니다.

또한, 필요에 따라 자식 클래스에서 기능을 새롭게 정의하거나 수정할 수도 있습니다.

 

그렇다면 이러한 구조를 통해 어떤 장점을 가질 수 있을까요?

중복되는 코드를 방지하고 체계적으로 설계가 가능합니다!🧐

 

 

예를 들어, 반려 동물들 중 강아지와 고양이를 생각해보죠.

class Pet:
  def __init__(self, name):
    self.name = name
  
  def __str__(self):
    return f"이름: {self.name}"

class Dog(Pet):
  def __init__(self, name, bark_volume):
    super().__init__(name)
    self.bark_volume=bark_volume
  def __str__(self):
    dog_name=super().__str__()
    return f"{dog_name}, 짖음크기: {self.bark_volume}"

class Cat(Pet):
  def __init__(self, name, grooming_frequency):
    super().__init__(name)
    self.grooming_frequency=grooming_frequency
  def __str__(self):
    cat_name=super().__str__()
    return f"{cat_name}, 그루밍횟수: {self.grooming_frequency}"

dog=Dog('멍이',50)
print(dog)	# 이름: 멍이, 짖음크기: 50

cat=Cat('냥이',10)
print(cat)	# 이름: 냥이, 그루밍횟수: 10

 

반려 동물들에게는 공통적으로 이름이나 애칭을 갖고 있습니다.

하지만 강아지들은 짖는다는 특성을 갖고 있고, 고양이들은 혼자서 그루밍을 하는 고유한 특성을 갖고 있습니다.

 

이 공통된 부분을 부모 클래스로 정의하고,

각각의 고유한 특성은 자식 클래스에서 추가하면 훨씬 효율적인 구조를 만들 수 있습니다.

 

만약 상속을 사용하지 않고 각각 강아지와 고양이에 대한 클래스를 작성을 한다면,

공통의 성질들을 각 코드마다 매번 반복해서 작성을 해줘야 한다는 불필요함이 있어요.

 

따라서 공통 기능은 부모 클래스에 정의하고, 자식 클래스에서는 이를 상속받아 확장하는 방식이 효율적이겠죠?

 

 

또한 상속 구조에서는 자식 클래스는 부모 클래스의 기능을 사용할 수 있지만, 부모 클래스는 자식 클래스의 기능을 사용할 수 없습니다.

class A:
  def prt(self):
    print("A-prt")

class B(A):
  def show(self):
    print("B-show")

a1=A()
a1.prt()	# A-prt
a1.show()	# Error

b1=B()
b1.prt()	# A-prt
b1.show()	# B-show

 

이는 자식 클래스가 부모의 확장 개념이기 때문입니다.

즉, 자식 클래스는 부모 클래스의 속성과 메서드를 모두 포함하면서, 추가적인 기능을 더한 구조입니다.

 

오버라이딩(Override)

그렇다면 부모 클래스와 자식 클래스에 같은 이름의 메서드가 존재하면 어떻게 될까요?

class A:
  def prt(self):
    print('aaa')

class B(A):
  def prt(self):
    print('bbb')
    
b=B()
b.prt()	# bbb

 

동일한 이름으로 메서드를 작성하고 심지어 실행구문도 다르게 작성을 했는데 오류가 나지 않은 것을 확인할 수 있었습니다.

이 경우 오류가 발생하지 않고, 자식 클래스의 메서드가 우선적으로 실행됩니다.

 

이처럼 부모클래스의 메서드를 자식 클래스에서 다시 정의하여 다른 동작을 하도록 만드는 것을 

"메서드 오버라이딩" 이라고 합니다.😮

 

"덮어쓰기"와 비슷한 개념이라고 생각하시면 됩니다.

 

즉, 오버라이딩은 완전히 새로운 기능으로 바꿀 수도 있지만,

기존의 기능을 포함해서 더 확장해 나갈 수도 있습니다.

 

super()

자식 클래스에서 부모 클래스의 메서드를 호출을 할 수도 있는데요,

부모 클래스의 기능을 그대로 유지하면서 새로운 기능도 정의해서 추가를 할 수가 있습니다.

class A:
  def __init__(self):
    print("A-init")

class B(A):
  def __init__(self):
    super().__init__()
    print("B-init")

b=B() # A-init
      # B-init

 

이때 사용하는 것이 바로 super() 함수입니다.

자식 클래스에서 부모 클래스의 메서드를 호출할 경우에 사용하는 함수입니다.

 

만약 super()가 없었다면, 클래스 B에서 재정의한 생성자의 실행문만 출력이 되었을텐데,

super() 함수를 사용함으로써 부모 클래스의 초기화 작업을 유지하면서,

자식 클래스의 추가적인 초기화 작업도 함께 수행할 수 있습니다.

 

즉, super().메서드명() 형태로 사용하며, 부모의 기능을 그대로 활용하면서 기능을 확장할 때 매우 유용합니다.

 

 

또한 상속은 부모-자식 한 단계에서 끝이 아니라,

여러 단계를 거쳐 계층적인 구조로도 확장이 가능합니다.

 

 

앞으로 코드를 작성할 때 공통적인 속성과 기능이 반복된다면, 이를 부모 클래스로 분리하고 하위 클래스를 통해 확장하여 코드의 재사용성과 유지보수성을 높이는 방향으로 설계해봐야겠어요!🙂


'개발' 카테고리의 다른 글

파이썬: 예외처리  (0) 2026.04.12
파이썬: 파일 입출력  (0) 2026.04.11
파이썬: 클래스와 객체  (1) 2026.04.09
파이썬: 람다함수(Lambda Functions)  (1) 2026.04.09
파이썬: 함수 선언하기  (0) 2026.04.09