Python 클래스와 상속 기본 개념

클래스의 캡슐화:

  • 캡슐화는 클래스 내부의 정보를 숨기고, 외부에서 직접 변수를 수정하지 못하도록 하는 기법입니다. 클래스가 제공하는 메서드를 통해서만 숨겨진 정보에 접근하고 조작할 수 있습니다.
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() 함수 사용:

  1. 자식 클래스가 부모 클래스를 상속받지만 초기화를 하지 않으면, 자동으로 부모 클래스의 속성을 상속받습니다.
  2. 자식 클래스가 부모 클래스를 상속받고 초기화를 하지만, super()를 호출하여 부모 클래스의 생성자를 초기화하지 않으면, 자식 클래스는 부모 클래스의 속성을 상속받지 않습니다.
  3. 자식 클래스가 부모 클래스를 상속받고 초기화하며, 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

태그: python 클래스 상속 객체지향 캡슐화

5월 22일 21:41에 게시됨