build my life

[Python] 상속 본문

Python

[Python] 상속

dalovee 2022. 8. 9. 17:31
728x90

상속

  • 이미 구현된 클래스의 기능(메소드)을 그대로 가져다가 사용하거나 아니면 그 기능을 수정하거나 추가할 때 사용하는 개념
  • 부모 클래스의 속성(인스턴스변수와 메소드)들과 자식클래스가 그대로 물려받는 개념
  • 확장 개념, 부모클래스와 자식클래스가 합쳐지는 개념
#부모클래스
class PlayerCharacter:
    def __init__(self, hp = 100, exp = 0):
        print(f"부모의 주소값 : {id(self)}")
        self.hp = hp
        self.exp = exp

    def attack(self):
        print("공격하기")
        self.exp = self.exp + 2

    def defend(self):
        print("방어하기")
        self.exp = self.exp + 1


#자식클래스
class Wizard(PlayerCharacter): #부모클래스 상속
    def __init__(self, mp):
        print(f"자식의 주소값 : {id(self)}")
        self.mp = mp
        super().__init__() #부모클래스에 접근해서 __init__(생성자)을 실행하겠다.

    def magic_skill(self):
        print("마법공격하기")
        self.mp -= 2

 

✅ 자식클래스가 부모 클래스를 상속받기 위해서는 "class 클래스명(부모클래스)" 로 작성해줘야한다.

✅ 자식클래스가 부모 클래스의 인스턴스변수를 가져다가 사용하려면 자식클래스의 __init__ 메소드 안에 "super().__init__()" 을 선언해줘야 접근 가능하다.

✅ 상속을 하면 정말 부모클래스와 자식클래스가 합쳐질까? -> 주소값 확인한 결과 두 클래스가 같은 주소값을 가지고 있는것이 확인이 된다.

 

 

오버라이딩

  • 부모로 부터 받는 메소드를 수정하고 싶을 때 자식클래스에서 재정의 하는 것
#부모클래스
class PlayerCharacter:
    def __init__(self, hp = 100, exp = 0):

        self.hp = hp
        self.exp = exp

    def attack(self):
        print("공격하기")
        self.exp = self.exp + 2

    def defend(self):
        print("방어하기")
        self.exp = self.exp + 1


#자식클래스
class Wizard(PlayerCharacter):
    def __init__(self, mp):

        self.mp = mp
        super().__init__() #부모클래스에 접근해서 __init__(생성자)을 실행하겠다.

    def magic_skill(self):
        print("마법공격하기")
        self.mp -= 2

    #오버라이딩
    def defend(self):
        print("마법사가 방어!")
        self.exp = self.exp + 5

✅ 오버로딩과 오버라이딩의 차이

- 오버로딩(overloading) : 새로운 메소드를 정의하는 것

- 오버라이딩(overriding) : 상속 받은 기존의 메소드를 재정의하는 것

 

✅ 오버라이딩의 필요성

- 상속 받은 메소드를 그대로 사용할 수 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 필요가 생긴다.

- 오버라이딩을 하지 않으면 이름을 다르게 해야하는데 그럼 그 메소드가 여전히 살아 있기에 문제 발생!

- 알맞지 않은 기능은 못쓰게 해야 하기 때문에 이 기능을 다른 기능으로 바꾸기 위해 오버라이딩 사용

(참조:http://wiki.hash.kr/index.php/%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9)

 


오버라이딩이 단순히 비효율적이라고 생각했다. 그냥 부모 클래스에 있는 코드를 바꾸면 되지 않나?

오늘 본 예시에서는 자식클래스가 하나이지만 상속 받는 자식클래스가 많을 경우 각각 클래스마다 상황에 맞게 변경해야하는 경우가 생긴다.

이런 경우에는 부모클래스에 있는 메소드의 기능을 다른 기능으로 바꿔야하기 때문에 오버라이딩이 필요하다는 걸 알게 되었다.

 

728x90