상속은 기존 클래스를 확장해 새로운 클래스를 만드는 것이다. 더 쉽게 설명하자면, 새로운 클래스를 만들 때 기존에 존재하는 클래스를 받아와서 그 클래스의 무언가를 이용하는 것이다.
이때 기본적으로 자식 클래스(새로운 클래스)는 부모 클래스(기존 클래스)의 모든 속성과 메서드를 물려받는다.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return "울 수 있음"
class Cat(Animal): # animal을 상속함
def speak(self):
return "애옹"
cat = Cat("턱시도냥")
print(cat.name)
print(cat.speak())
Animal에 name 속성, speak 함수를 작성했다.
그 다음 새로운 클래스인 Cat을 만들었다. 이때 파라미터로 Animal을 넣어주면 Animal이 부모 클래스, Cat이 자식 클래스가 되며, Cat 클래스는 Animal 클래스에 있는 모든 기능을 사용할 수 있다.
name 속성을 Cat 클래스에서 따로 정의해주지 않아도 바로 cat = Cat("턱시도냥") 처럼 사용 가능한 것이다!
위 코드에서 부모 클래스인 Animal에 speak() 함수가 이미 있는데, Cat 클래스에서 이를 받아 같은 이름으로 다시 정의해주었다.
이렇게 자식 클래스에서 부모 클래스의 메서드를 같은 이름으로 다시 정의하는 것을 메서드 오버라이딩(Overriding)이라고 한다. 이를 통해 부모 클래스의 기능을 변경할 수 있다.
부모 클래스를 상속한다는 것은 부모 클래스의 모든 기능을 받아오는 것이다.
그런데 부모 클래스의 모든 기능을 사용하면서, 자식 클래스만의 새로운 기능을 추가하고 싶다면?
이럴 때 super()를 사용한다.
class Animal:
def __init__(self, name):
self.name = name
def spaek(self):
return "울 수 있음"
class Cat(Animal): # animal을 상속함
def __init__(self, name, color):
super().__init__(name)
self.color = color
def speak(self):
return "애옹"
cat = Cat("턱시도냥", "검정색")
print(cat.name)
print(cat.color)
print(cat.speak())
아까의 Cat 클래스에 고양이 색상이라는 새로운 기능을 만들고 싶었다. 그래서 super()를 사용해 부모 클래스인 Animal의 __init__을 가지고 와서 새 속성 color를 추가해줬다.
한 번에 여러 부모 클래스를 상속받는 것이다. 클래스를 정의해줄 때 파라미터로 여러 클래스를 주면 된다.
class Childclass(부모1, 부모2)
이러면 ChildClass 안에서는 부모1, 부모2의 모든 기능을 사용할 수 있다.