Dev

[Python] 7. 클래스 상속

mlslly 2024. 5. 4. 11:30

클래스 상속 (Class Inheritence)

 

 

클래스 상속 개념

 

클래스는 다른 클래스를 상속받을 수 있다. 

클래스를 처음부터 만들지 않고, 기존 클래스의 기능들을 기본적으로 추가한 뒤 몇개만 더하고 싶을 때 유용하다.

ex. Chef 클래스의 기능을 상속받아 Pastery Chef 클래스를 만들기 

 

클래스 상속 방법은 생각보다 간단하다.

아래 코드에서 Fish 클래스는 class Fish(Animal) 함으로써 Animal 클래스를 상속받은 것. Fish 클래스에서 Animal 클라스에있던 객체 및 메소드들을 모두 가져 오고 싶다면, __init__ 생성자를 추가할 때 super().__init__()이라는 코드를 적어주면 된다.

 

여기서 super란 '상위'를 의미한다. 즉 상위/super 클래스가 곧 Animal class가 되는 것.

super().__init__() 기능은, 상위 클래스가 Fish class에서 할 수 있는 것을 모두 initialize (시작) 함을 의미한다.

 

다만 super().__init__을 필수로 실행해야 하는건 아니다. 부모 클래스의 생성자를 명시적으로 호출하지 않아도 파이썬은 자동으로 호출한다.

그러나 만약 하위 클래스에서 초기화해야 할 속성이 있거나 추가적인 초기화 작업이 필요하다면 super().__init__()을 사용하여 부모 클래스의 생성자를 '명시적으로 호출'하는 것이 좋다.

class Fish(Animal): 
	def __init__(self):
    	super().__init__()

 

 

클래스 상속 예시 

 

아래 예시 코드에서, Animal 클래스와 Fish 클래스가 정의되고, Fish 클래스는 Animal 클래스를 상속받는다. 

Fish 클래스는 Animal 클래스의 모든 메소드와 속성을 사용할 수 있으므로, swim 기능과 더불어 breathe, num_eyes 확인 기능도 사용할 수 있다. 

class Animal : 
    def __init__(self):
        self.num_eyes = 2

    def breathe(self):
        print('Inhale, exhale')


class Fish(Animal) : 
    def __init__(self):
        super().__init__()

    def swim(self):
        print('moving in water')


nemo = Fish()
nemo.swim()
nemo.breathe()  # Animal class의 메소드
print(nemo.num_eyes) # Animal class의 속성

 

메소드 상속 예시 

 

메소드를 그냥 사용하지 않고, 거기에 특정 내용을 추가하고 싶다면, 

아래 Fish 클래스의 breathe 메소드처럼, 메소드를 정의하고 내용을 추가시 super().breath()를 적어준다.

그렇게되면 Fish 클래스의 객체가 실행될 때, Animal 클래스의 breath 메소드 기능과 더불어 Fish 클래스의 breath 메소드 기능을 함께 구현할 수 있다. 

아래 코드를 실행하면, Animal 클래스의 breath 메소드 기능인 'Inhale, Exhale'도 함께 프린트되는 것을 볼 수 있다.

class Animal : 
    def __init__(self):
        self.num_eyes = 2

    def breathe(self):
        print('Inhale, exhale')


class Fish(Animal) : 
    def __init__(self):
        super().__init__()

    def breathe(self):
        super().breathe()
        print('doing this underwater')

    def swim(self):
        print('moving in water')


nemo = Fish()
nemo.swim()
nemo.breathe()  # Animal 클래스, Fish 클래스의 breathe 기능
print(nemo.num_eyes)

 

이와 같은 식으로, 이미 만들어진 클래스를 가져와서 상속받아 그대로 사용하거나 수정해서 활용하는 것이 가능하다.

 

다른 예시를 하나만 더 보자. 아래 코드의 실행 결과로 

Dog 클래스의 bark 메소드의 기능과, Labrador 클래스의 bark 메소드의 기능이 모두 실행됨을 알 수 있다.

class Dog:
    def __init__(self):
        self.temperament = "loyal"
 
    def bark(self):
        print("Woof, woof!")
 
class Labrador(Dog):
    def __init__(self):
        super().__init__()
        self.is_a_good_boy = True
 
    def bark(self):
        super().bark()
        print("Greetings, good sir. How do you do?")


sparky = Labrador()
sparky.bark()