프로그래밍 언어/Python

Python 상속 코드 재사용성 극대화를 위한 객체 지향 프로그래밍 가이드 - Python 기초 #12

eco7T 2024. 5. 23. 07:44
반응형

이번 글에서는 파이썬의 "상속(Inheritance)"에 대해 입문자를 위한 가이드를 정리해 보도록 하겠습니다. 간단한 예시 코드를 통해 상속 개념을 쉽게 이해할 수 있도록 하겠습니다.

파이썬 상속 Python Inheritance
파이썬 상속 Python Inheritance

 

파이썬 상속 (Inheritance)

상속은 객체 지향 프로그래밍의 핵심 개념 중 하나입니다. 클래스 간의 계층 관계를 정의하여 상위 클래스(부모 클래스)의 속성과 메서드를 하위 클래스(자식 클래스)에서 물려받아 재사용할 수 있게 해 줍니다.

이를 통해 코드 재사용성과 가독성이 높아지며, 프로그램의 생산성과 유지보수성이 향상됩니다.

상속의 장점

  • 코드 재사용성 향상: 부모 클래스의 속성과 메서드를 자식 클래스에서 그대로 사용할 수 있어 중복 코드를 줄일 수 있습니다
  • 코드 가독성 향상: 클래스 계층 구조가 명확해져 코드를 이해하기 쉬워집니다
  • 클래스 계층 구조 구축 가능: 코드를 체계적으로 구성할 수 있습니다
  • 개방-폐쇄 원칙(Open-Closed Principle) 준수: 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있습니다

상속 구현 방법

파이썬에서 클래스 상속은 다음과 같이 구현합니다:

class 부모클래스: # 부모 클래스 정의 class 자식클래스(부모클래스): # 자식 클래스 정의

자식 클래스 정의 시 괄호 안에 부모 클래스 이름을 적어주면 부모 클래스로부터 속성과 메서드를 물려받습니다.

 

예시 1: 동물 계층 구조

class Animal: def __init__(self, name): self.name = name def speak(self): print(f"{self.name} 소리를 냅니다.") class Dog(Animal): def __init__(self, name): super().__init__(name) # 부모 클래스 속성 상속 def speak(self): print(f"{self.name} 멍멍!") # 부모 메서드 오버라이딩 class Cat(Animal): def __init__(self, name): super().__init__(name) def speak(self): print(f"{self.name} 야옹!") dog = Dog("멍멍이") cat = Cat("야옹이") dog.speak() # 멍멍이 멍멍! cat.speak() # 야옹이 야옹!

이 예시에서는 `Animal` 클래스를 부모 클래스로 하여 `Dog`과 `Cat` 클래스를 자식 클래스로 정의했습니다. `Dog`과 `Cat` 클래스는 `Animal` 클래스의 속성과 메서드를 상속받아 활용하며, `speak` 메서드는 오버라이딩되어 각 동물 소리를 출력합니다.

 

예시 2: 은행 계좌 시스템

class Account: def __init__(self, owner, balance=0): self.owner = owner self.balance = balance def deposit(self, amount): self.balance += amount print(f"{self.owner}님의 계좌에 {amount}원이 입금되었습니다. 잔액은 {self.balance}원입니다.") def withdraw(self, amount): if self.balance < amount: print(f"{self.owner}님의 계좌 잔액이 부족합니다. 잔액은 {self.balance}원입니다.") else: self.balance -= amount print(f"{self.owner}님의 계좌에서 {amount}원이 출금되었습니다. 잔액은 {self.balance}원입니다.") class SavingsAccount(Account): def __init__(self, owner, balance=0, interest_rate=0.03): super().__init__(owner, balance) self.interest_rate = interest_rate def add_interest(self): interest = self.balance * self.interest_rate self.deposit(interest) print(f"{self.owner}님의 계좌에 이자 {interest}원이 지급되었습니다.") account1 = Account("Alice", 1000) account2 = SavingsAccount("Bob", 2000, 0.05) account1.deposit(500) # Alice님의 계좌에 500원이 입금되었습니다. 잔액은 1500원입니다. account2.withdraw(1000) # Bob님의 계좌에서 1000원이 출금되었습니다. 잔액은 1000원입니다. account2.add_interest() # Bob님의 계좌에 이자 50원이 지급되었습니다. Bob님의 계좌에 50원이 입금되었습니다. 잔액은 1050원입니다.

이 예시에서는 `Account` 클래스를 부모 클래스로 하여 `SavingsAccount` 클래스를 자식 클래스로 정의했습니다. `SavingsAccount` 클래스는 `Account` 클래스의 속성과 메서드를 상속받아 활용하며, 추가로 `interest_rate` 속성과 `add_interest` 메서드를 포함하여 적금 계좌의 특성을 구현했습니다.

 

이처럼 상속을 활용하면 기존 코드를 재사용하면서 새로운 기능을 쉽게 추가할 수 있습니다.

 

다중 상속

파이썬에서는 하나의 클래스가 여러 부모 클래스를 상속받을 수 있습니다. 이를 다중 상속(Multiple Inheritance)이라고 합니다.

class 자식클래스(부모클래스1, 부모클래스2, ...): # 자식 클래스 정의

다중 상속 시 주의할 점은 부모 클래스들 간에 동일한 메서드가 있을 경우, 먼저 나오는 부모 클래스의 메서드가 우선 적용된다는 점입니다.

 

다음과 같은 예시 코드를 통해 설명드리겠습니다.

class Animal: def __init__(self, name): self.name = name def speak(self): print(f"{self.name} 소리를 냅니다.") class Flyable: def fly(self): print(f"{self.name} 날개를 펴고 날아갑니다.") class Bird(Animal, Flyable): def __init__(self, name): Animal.__init__(self, name) Flyable.__init__(self) bird = Bird("참새") bird.speak() # 참새 소리를 냅니다. bird.fly() # 참새 날개를 펴고 날아갑니다.

이 예시에서는 `Animal` 클래스와 `Flyable` 클래스를 부모 클래스로 하고, `Bird` 클래스가 이 두 클래스를 다중 상속받고 있습니다.

  • `Animal` 클래스에는 `speak` 메서드가 정의되어 있어 동물이 소리를 낼 수 있습니다
  • `Flyable` 클래스에는 `fly` 메서드가 정의되어 있어 날 수 있는 기능을 제공합니다
  • `Bird` 클래스는 `Animal`과 `Flyable` 클래스의 속성과 메서드를 모두 상속받아, 소리를 내고 날 수 있는 특성을 가지게 됩니다

`Bird` 클래스의 인스턴스인 `bird`를 생성한 후, `speak`와 `fly` 메서드를 호출하면 각각 "참새 소리를 냅니다."와 "참새 날개를 펴고 날아갑니다."라는 메시지가 출력됩니다.

 

다중 상속을 통해 두 개 이상의 부모 클래스의 특성을 조합하여 새로운 클래스를 만들 수 있습니다. 이렇게 만들어진 클래스는 부모 클래스들의 속성과 메서드를 모두 상속받게 됩니다.

반응형