상속
클래스 상속은 한 클래스의 특성(속성 및 메서드)을 다른 클래스가 가져오는 것을 의미합니다. 상속을 통해 코드의 재사용성을 높이고 모듈성을 강화할 수 있습니다.
- 부모 클래스(또는 기본 클래스, 슈퍼 클래스): 특성이 상속되는 클래스.
- 자식 클래스(또는 파생 클래스, 서브 클래스): 부모 클래스의 특성을 상속받는 클래스.
자식 클래스는 부모 클래스의 모든 속성과 메서드를 상속받습니다. 또한, 자식 클래스는 부모 클래스에 없는 새로운 속성이나 메서드를 추가하거나, 부모 클래스의 메서드를 오버라이드(재정의)하여 기능을 수정할 수 있습니다.
클래스를 상속하는 방법은 아래 예시처럼 새로운 클래스의 ()
안에 상속할 클래스명을 적어주는 것입니다. class를 생성할 때 Car(object)
처럼 기존에 생략해왔던 object를 넣도록 하겠습니다. 이 object는 파이썬의 기본 객체 클래스를 의미합니다. 파이썬 2에서는 이걸 명시적으로 써주어야 기본적으로 클래스에 들어가야 하는 항목들이 들어갑니다. 파이썬 3에서는 이걸 명시적으로 쓰지 않더라도 기본적으로 들어가야 하는 여러 메서드를 함께 생성합니다.
여기에서 상속을 하는 Car
는 HybridCar
입장에서 부모 클래스(슈퍼 클래스)가 되고 HybridCar
는 Car
클래스에서는 자식 클래스(서브 클래스)가 됩니다.
HybridCar
클래스는 기존의 Car
클래스가 사용하던 데이터와 기능들을 모두 사용할 수 있으며, 추가적인 기능을 만들었습니다. 또한 maxPeople
의 데이터를 새로 덮어씌워 자기 자신만의 클래스 변수를 새로 정의할 수 있습니다.
# 출력
300
300
2000
출발하였습니다.
# 출력
300
300
2000
출발하였습니다.
예를 들어, 게임 내에서 모든 캐릭터가 공통적인 특성을 가진다고 가정해 봅시다. 이 때 모든 캐릭터를 이 클래스를 통해 생성하면 다음과 같은 문제가 발생할 수 있습니다.
- 영웅은 스킬이 있습니다.
- 영웅은 아이템이 있습니다.
- 영웅은 미션이 있습니다.
- 몹은 드랍률이 있습니다.
- 몹은 드랍 아이템이 있습니다.
이럴 때, 기본적인 특성을 Character
클래스에 정의하고, 문제점이었던 특화된 특성을 가진 Hero
와 Mob
클래스를 만들어 Character
로부터 상속받을 수 있습니다.
아래 코드에서 Character
는 모든 캐릭터가 공통적으로 가지는 속성과 메소드를 정의합니다. 그리고 Mob
클래스는 Character
클래스로부터 상속받아, 몬스터 특유의 드랍률
과 드랍아이템
속성을 추가로 가집니다. 마찬가지로, Hero
클래스도 Character
로부터 상속받아 영웅만의 특성을 추가할 수 있습니다.
class Character:
최대속력 = 100
최대레벨 = 50
def __init__(self, name, hp, attack, lv):
self.이름 = name
self.체력 = hp
self.공격력 = attack
self.레벨 = lv
self.속력 = 1
def move(self):
print(f'{self.이름}이(가) {self.속력}의 이동속도로 움직였습니다.')
def attack(self):
print(f'{self.이름}이(가) {self.공격력}의 데미지로 공격했습니다.')
class Mob(Character):
def __init__(self, name, hp, attack, lv, droprate, dropitem):
super().__init__(name, hp, attack, lv)
self.드랍률 = droprate
self.드랍아이템 = dropitem
# 위 코드는 아래와 같은 기능입니다.
# class Mob(Character):
# def __init__(self, name, hp, attack, lv, droprate, dropitem):
# self.이름 = name
# self.체력 = hp
# self.공격력 = attack
# self.레벨 = lv
# self.드랍률 = droprate
# self.드랍아이템 = dropitem
# self.속력 = 1
class Hero(Character):
def __init__(self, name, hp, attack, lv, skills, items, missions):
super().__init__(name, hp, attack, lv)
self.스킬 = skills
self.아이템 = items
self.미션 = missions
def use_skill(self, skill):
if skill in self.스킬:
print(f'{self.이름}이(가) {skill} 스킬을 사용했습니다.')
else:
print(f'{skill} 스킬을 가지고 있지 않습니다.')
class Character:
최대속력 = 100
최대레벨 = 50
def __init__(self, name, hp, attack, lv):
self.이름 = name
self.체력 = hp
self.공격력 = attack
self.레벨 = lv
self.속력 = 1
def move(self):
print(f'{self.이름}이(가) {self.속력}의 이동속도로 움직였습니다.')
def attack(self):
print(f'{self.이름}이(가) {self.공격력}의 데미지로 공격했습니다.')
class Mob(Character):
def __init__(self, name, hp, attack, lv, droprate, dropitem):
super().__init__(name, hp, attack, lv)
self.드랍률 = droprate
self.드랍아이템 = dropitem
# 위 코드는 아래와 같은 기능입니다.
# class Mob(Character):
# def __init__(self, name, hp, attack, lv, droprate, dropitem):
# self.이름 = name
# self.체력 = hp
# self.공격력 = attack
# self.레벨 = lv
# self.드랍률 = droprate
# self.드랍아이템 = dropitem
# self.속력 = 1
class Hero(Character):
def __init__(self, name, hp, attack, lv, skills, items, missions):
super().__init__(name, hp, attack, lv)
self.스킬 = skills
self.아이템 = items
self.미션 = missions
def use_skill(self, skill):
if skill in self.스킬:
print(f'{self.이름}이(가) {skill} 스킬을 사용했습니다.')
else:
print(f'{skill} 스킬을 가지고 있지 않습니다.')
이러한 방식으로 코드를 구성하면, 각 클래스는 독립적으로 특화된 속성과 메소드를 가지면서도 공통적인 기능은 부모 클래스에서 상속받아 중복을 최소화할 수 있습니다. Hero
클래스에는 영웅만의 스킬, 아이템, 미션 등을 추가하였고, Mob
클래스에는 드랍률과 드랍아이템을 추가했습니다. 이렇게 함으로써, 각 클래스는 자신만의 고유한 기능을 가지면서도 기본적인 캐릭터의 속성을 공유할 수 있게 됩니다.