클래스의 캡슐화:
- 캡슐화는 클래스 내부의 정보를 숨기고, 외부에서 직접 변수를 수정하지 못하도록 하는 기법입니다. 클래스가 제공하는 메서드를 통해서만 숨겨진 정보에 접근하고 조작할 수 있습니다.
class Monster():
# 클래스의 공용 속성
species = "악마"
# 클래스 초기화(생성자), 클래스 인스턴스화 시 자동 호출됩니다.
def __init__(self, name, health, mana, power):
self.name = name
self.health = health
self.mana = mana
self.power = power
# 몬스터가 공격받을 때 HP 감소
def take_damage(self, player_attack):
# 공격받으면 HP 감소
self.health -= player_attack
print(f"{self.name}이(가) {player_attack}의 피해를 입었습니다.")
print(f"{self.name}의 현재 체력: {self.health}")
# 플레이어 공격 시 플레이어 HP 감소
def attack_player(self, player_health):
player_health -= self.power
print(f"플레이어가 {self.power}의 피해를 입었습니다.")
print(f"플레이어의 현재 체력: {player_health}")
# 마나가 가득 찼을 때 스킬 발동
def ultimate_skill(self):
print(f"{self.name}: 하하, 궁극기 발동!")
print("플레이어가 공중으로 날아가 99999의 피해를 입었습니다.")
print("플레이어 사망!")
# 플레이어 속성 설정
player_attack = 150
player_health = 1500
# 인스턴스 생성
monster = Monster("아이스데몬", 12000, 10, 450)
# 인스턴스 메서드 호출
monster.take_damage(player_attack)
monster.attack_player(player_health)
monster.ultimate_skill()
실행 결과:
>>> 아이스데몬이(가) 150의 피해를 입었습니다.
>>> 아이스데몬의 현재 체력: 11850
>>> 플레이어가 450의 피해를 입었습니다.
>>> 플레이어의 현재 체력: 1050
>>> 아이스데몬: 하하, 궁극기 발동!
>>> 플레이어가 공중으로 날아가 99999의 피해를 입었습니다.
>>> 플레이어 사망!
클래스의 상속:
- 부모 클래스로부터 상속받아, 자식 클래스가 부모 클래스의 특성(속성과 메서드)을 얻을 수 있습니다.
- 객체 지향 프로그래밍에서 부모 클래스로부터 상속받으면, 자식 클래스는 부모 클래스의 속성과 메서드를 직접 사용할 수 있어 코드 재사용성을 높일 수 있습니다. 자식 클래스는 자신만의 속성과 메서드를 추가로 정의할 수 있습니다.
class Creature():
def __init__(self, name, hp, attack):
self.name = name
self.hp = hp
self.attack = attack
def perform_attack(self):
print(f"{self.name}이(가) 공격을 시도합니다. 플레이어가 {self.attack}의 피해를 입었습니다!")
# Creature 클래스 상속
class Creature2(Creature):
pass
# 인스턴스 생성
creature = Creature("지렁이", 15, 3)
creature2 = Creature2("돼지", 200, 25)
creature.perform_attack()
creature2.perform_attack()
# 부모 클래스: Creature는 Creature2의 부모 클래스로도 알려지며, 기본 클래스 또는 슈퍼 클래스라고 합니다
# 자식 클래스: Creature2는 Creature의 자식 클래스로도 알려지며, 파생 클래스라고 합니다
# 정의되지 않은 경우 object 클래스를 상속받는 것과 동일하며, Python에서 object는 모든 클래스의 최상위 부모 클래스입니다
실행 결과:
>>> 지렁이이(가) 공격을 시도합니다. 플레이어가 3의 피해를 입었습니다!
>>> 돼지이(가) 공격을 시도합니다. 플레이어가 25의 피해를 입었습니다!
상속에서의 Super() 함수 사용:
- 자식 클래스가 부모 클래스를 상속받지만 초기화를 하지 않으면, 자동으로 부모 클래스의 속성을 상속받습니다.
- 자식 클래스가 부모 클래스를 상속받고 초기화를 하지만, super()를 호출하여 부모 클래스의 생성자를 초기화하지 않으면, 자식 클래스는 부모 클래스의 속성을 상속받지 않습니다.
- 자식 클래스가 부모 클래스를 상속받고 초기화하며, super()를 호출하여 부모 클래스의 생성자를 초기화하면, 자식 클래스는 부모 클래스의 속성도 상속받습니다.
class BaseCreature():
def __init__(self):
self.name = "곤충"
self.rank = 1
def display_info(self):
print(f"{self.name} - 레벨: {self.rank}")
# 일반적으로 자식 클래스가 초기화를 하면 부모 클래스의 속성을 상속받지 않지만, super() 함수를 사용할 수 있습니다
class AdvancedCreature(BaseCreature):
def __init__(self):
self.name = "거미"
self.rank = 7
super().__init__()
# 이미 초기화된 자식 클래스는 부모 클래스의 속성을 상속받지 않으며, 이미 존재하는 메서드도 마찬가지입니다
class SpecialCreature(BaseCreature):
def __init__(self):
self.name = "나비"
self.rank = 3
def display_info(self):
print(f"{self.name} - 레벨: {self.rank}")
creature = BaseCreature()
advanced_creature = AdvancedCreature()
special_creature = SpecialCreature()
creature.display_info()
advanced_creature.display_info()
special_creature.display_info()
실행 결과:
>>> 곤충 - 레벨: 1
>>> 곤충 - 레벨: 1
>>> 나비 - 레벨: 3