본문 바로가기
Python/Basic

[파이썬, Python] 상속 - 클래스 상속, 메소드 오버라이딩, 다중 상속

by coding-choonsik 2023. 3. 10.
728x90
반응형
SMALL

1. 상속

  • 기존의 정의해둔 클래스의 기능을 그대로 물려받음
  • 기존 클래스에 기능 일부를 추가하거나, 변경하여 새로운 클래스를 정의함
  • 코드를 재사용할 수 있게 됨
  • 안정적이고 유지보수에 용이함
  • 상속을 받고자 하는 대상인 기존 클래스를 부모 클래스(parent class, super class, base class) 라고 부름
  • 상속을 받는 새로운 클래스는 자식 클래스(child class, sub class)라고 부름

 


 

  • 부모 클래스 만들기
class Animal:
  def  __init__(self, name, age):
    self.name = name
    self.age = age

  def eat(self, food):
    print(f'{self.name}는 {food}를 먹습니다')

  def sleep(self, hour):
    print(f'{self.name}는 {hour}시간 동안 잠을 잡니다')
animal = Animal('동물', 14)      # 객체 생성
animal.eat('먹이')
animal.sleep(14)

>>> 동물는 먹이를 먹습니다
동물는 14시간 동안 잠을 잡니다

 

  • 부모 클래스를 상속받아 자식 클래스 
class Cat(Animal):
  pass
  
BackDu = Cat('백두',4)    # BackDu라는 객체를 생성
BackDu.eat('먹이')        # Animal class(부모클래스)의 메소드를 그대로 사용 가능
BackDu.sleep(12)

>>> 백두는 먹이를 먹습니다
백두는 12시간 동안 잠을 잡니다

 


2. 메소드 오버라이딩(method overriding)

  • 부모 클래스의 method를 재정의
  • 자식 클래스의 인스턴스로 호출시 재정의된 메소드가 호출됨
  • super(): 부모클래스를 불러줌, 오버라이딩 한 자식클래스의 메소드가 아닌  부모 클래스의 원래 메소드를 사용하고자 할때

  • 부모 클래스
class Animal:
  def  __init__(self, name, age):
    self.name = name
    self.age = age

  def eat(self, food):
    print(f'{self.name}는 {food}를 먹습니다')

  def sleep(self, hour):
    print(f'{self.name}는 {hour}시간 동안 잠을 잡니다')

 

BackDu = Cat('백두',4)
BackDu.eat('사료')
BackDu.run()

>>> 백두는 사료를 먹습니다
백두는 달립니다.

 

  • 자식 클래스
class Cat(Animal):
  def run(self):
    print(f'{self.name}는 달립니다.')   
  
# 메소드 오버라이딩: 부모클래스의 eat메소드를 재구현
  def eat(self,food):                   
    print(f'{self.name}는 {food}를 아주 많이 먹습니다')    

  def super_eat(self, food):
    super().eat(food)
BackDu = Cat('백두',4)
BackDu.eat('사료')
BackDu.run()

>>> 백두는 사료를 아주 많이 먹습니다
백두는 달립니다.

 

  • 부모 클래스를 통해 다른 객체를 생성
# 부모클래스(Animal)를 통해 객체를 생성했기 때문에 자식 클래스(Cat)의 객체 메소드를 사용할 수 없음
animal = Animal('동물', 13)    
animal.eat('먹이')

>>> 동물는 먹이를 먹습니다

BackDu.super_eat('사료')
>>> 백두는 사료를 먹습니다    # 부모 클래스의 메소드 사용

3.  다중상속

  • C#, Java는 다중상속이 불가능
  • 파이썬은 C++과 같이 다중상속이 가능
  • 여러 클래스를 상속(개수의 제한이 없음)
  • 다중 상속을 하는 부모 클래스의 메소드가 다른 것이 좋음
  • mro(): 클래스가 어떤 클래스를 상속받았는지 알 수 있는 함수

  • 부모 클래스 1
class Animal:
  def  __init__(self, name, age):
    self.name = name
    self.age = age

  def eat(self, food):
    print(f'{self.name}는 {food}를 먹습니다')

  def sleep(self, hour):
    print(f'{self.name}는 {hour}시간 동안 잠을 잡니다')

 

  • 부모 클래스 2
class Human:
  def __init__(self, name, age):
    self.name = name
    self.age =age

  def study(self, hour):
     print(f'{self.name}는 {hour}시간 동안 공부를 합니다')
 
  • 두 개의 부모 클래스를 다중 상속 받는 자식 클래스
class KimApple(Animal, Human):  
	pass
    
kim = KimApple('김사과', 20)   # 객체 생성, 부모클래스의 생성자에 따른 매개변수 입력

kim.eat('빵')   # Animal 클래스 메소드 상속
>>> 김사과는 빵을 먹습니다

kim.study(2)    # Human 클래스 메소드 상속
>>> 김사과는 2시간 동안 공부를 합니다

KimApple.mro()   # 상속 받은 부모 클래스 알아보기

>>> [__main__.KimApple, __main__.Animal, __main__.Human, object]

 

 

728x90
반응형
LIST