Class 상속

장현웅·2023년 8월 27일
0

Class 상속


  • python의 class 상속

    • 클래스를 생성할 때 다른 클래스에 선언된 변수, 메소드 등의 기능들을 가져와 사용할 수 있도록 해주는 기능
    • 동일한 코드를 여러 클래스에서 조금씩 수정해 사용하거나 모듈에 내장되어 있는 클래스를 변경할 때 주로 사용
    • 부모(parents) 혹은 슈퍼(super) 클래스 : 상속 해주는 클래스
    • 자식(child) 혹은 서브(sub) 클래스 : 상속 받는 클래스
  • 상속 받은 클래스를 기반으로 새로운 클래스 만들기

class Monster():
    hp = 100
    alive = True

    def damage(self, attack): # self는 내가 받은 attack은 내가 받은 데미지
        self.hp = self.hp - attack
        if self.hp < 0:
            self.alive = False
            
    def status_check(self): # 죽었는지 살았는지
        if self.alive( == True):
            print('살아있다')
        else:
            print('죽었다')
            
m1 = Monster()
m1.damage(150)
m1.status_check() # 죽었다.

m2 = Monster()
m2.damage(90)
m2.status_check() # 살았다.

# 자체적으로 관리가 가능
# m1, m2는 인스턴스
  • 몬스터 클래스를 선언하고 instance를 생성해봤는데 여기서 불 속성, 얼음 속성 등 다양한 속성을 가진 몬스터를 만들기 위해서 상속을 사용하면 코드를 간소화 시킬 수 있다.
## 상속을 사용하지 않는 경우

class FireMonster():
    def __init__(self, hp):
        self.hp = hp
        
    def attack(self, damage):
        self.hp -= damage

    def status_check(self):
        print(f"monster's hp : {self.hp}")

class IceMonster():
    def __init__(self, hp):
        self.hp = hp
        
    def attack(self, damage):
        self.hp -= damage

    def status_check(self):
        print(f"monster's hp : {self.hp}")
        
class WindMonster():
    def __init__(self, hp):
        self.hp = hp
        
    def attack(self, damage):
        self.hp -= damage

    def status_check(self):
        print(f"monster's hp : {self.hp}")

# attack이나 status_check 함수들이 중복으로 들어가게 된다.
# 코드 관리가 어렵고 보기도 어렵다.
## 상속을 사용할 경우

class Monster(): # 고정. 건들지 않음.
    def __init__(self, hp):
        self.hp = hp
        
    def attack(self, damage):
        self.hp -= damage

    def status_check(self):
        print(f"monster's hp : {self.hp}")
        
class FireMonster(Monster): # class Monster을 상속받음. (class Monster : parents or super class / class FireMonster : child or sub class)
    def __init__(self, hp):
        self.attribute = "fire"
        
        super().__init__(hp) # super()를 사용하면 부모 클래스의 코드(__init__함수 : self.hp = hp코드)를 그대로 사용할 수 있다.
        					 
    
    # 부모 클래스에 존재하는 코드 중 변경하고 싶은 부분이 있으면 메소드(함수)를 overriding 한다.
    def status_check(self):
        print(f"fire monster's hp : {self.hp}")
        
class IceMonster(Monster):
    def __init__(self, hp):
        self.attribute = "ice"
        super().__init__(hp)
    
    def status_check(self):
        print(f"ice monster's hp : {self.hp}")
        
fire_monster = FireMonster(hp=100)  # FireMonster 클래스에는 attack 메소드가 없지만
									# 부모 클래스에서 상속받았기 때문에 별도의 선언 없이 사용 가능하다.
fire_monster.attack(20)
fire_monster.status_check()

ice_monster = IceMonster(hp=200)
ice_monster.attack(50)
ice_monster.status_check()

# fire monster's hp : 80
# icd monster's hp : 150
  • 상속 받은 클래스의 특정 코드를 변경해 사용하기
## 다른 사람이 만든 모듈의 계산기 코드를 사용하고 있다고 가정

class Calc:
    def _print_zero_division_error(self):
        print("can't be division by zero")
        
    def plus(self, num1, num2):
        ...

    def minus(self, num1, num2):
        ...

    def divide(self, num1, num2):
        if num2 == 0:
            self._print_zero_division_error()
            return False
        ...

    def multiply(self, num1, num2):
        ...

calc = Calc()
calc.divide(5, 0)

# can't be division by zero
# 이 멘트를 한글로 출력하고 싶다고 해서 모듈의 코드는 건드리지 않는 것이 좋다.

# 이때 상속을 활용하면 모듈 내 코드를 변경하지 않고 코드를 수정할 수 있다.

class CustomCalc(Calc): # Calc라는 부코 클래스를 상속 받음
    def _print_zero_division_error(self): 
        print("0으로는 나눌 수 없습니다.") # 코드 변경을 원하는 부분에 overriding 한다.

calc = CustomCalc() # 
calc.divide(5, 0)

# 0으로는 나눌 수 없습니다.

0개의 댓글