IT/파이썬 기초

[파이썬 기초] 메소드 오버라이딩

Daniel_5 2023. 7. 16. 07:12
반응형

메소드 오버라이딩

  • 부모 클래스의 메소드를 자식 클래스에서 재정의하여 사용 
  • 부모 클래스의 메소드의 일부를 변경하여 사용하고 싶을 때 유용함

 

메소드 오버라이딩의 이해와 예제

- 앞서 상속에서 설명한 과일을 예제로 설명해 보겠다.

- 과일 클래스로 부터 상속받아 사과클래스, 바나나클래스 등을 정의했다. 

- 과일 클래스의 메소드로 과일을 먹는 방법에 대하여 설명하는 메소드가 있다고 가정한다. 

- 과일들은 대부분 씻어먹는 과일이 많기 때문에 '잘 씻어서 먹어야 합니다.'라고 출력하는 메소드를 부모클래스에서 정의했다.

- 하지만 바나나의 경우 씻어먹는 것이 아닌 껍질을 벗겨서 먹는 과일이다! 이럴 경우 메소드를 따로 하나 더 만드는 것도 방법이 될 수 있겠지만 기존 부모클래스의 메소드를 재정의 함으로써 코드의 통일감을 줄 수 있다.  

class Fruit:

    def __init__(self, name, taste, color, price):
        self.name= name
        self.taste = taste
        self.color = color
        self.price = price

        print('과일의 이름은 {}입니다.'.format(self.name))
        print('과일의 맛은 {}합니다.'.format(self.taste))
        print('과일의 색은 {}입니다.'.format(self.color))
        print('과일의 가격은 {}입니다'.format(self.price))

    def howtoeat(self):
        print("잘 씻어서 먹어야 합니다.")

class Importation:

    def __init__(self, country, number):
        self.country = country
        self.number = number

        print('{}국가로부터 수입이 되었습니다.'.format(self.country))
        print('통관번호는 {}입니다.'.format(self.number))

앞서 상속에서 정의한 과일 클래스와 수입 클래스이다. 

class Apple(Fruit):

    def __init__(self,name,taste,color,price):
        Fruit.__init__(self,name,taste,color,price)

class Banana(Fruit, Importation):

    def __init__(self,name,taste,color,price, country, number):
        Fruit.__init__(self,name,taste,color,price)
        Importation.__init__(self,country, number)

사과 클래스와 바나나클래스는 과일 클래스를 상속받고 있으며, 바나나 클래스는 수입 클래스도 상속받고 있다. 

apple1 = Apple('사과','상큼','빨간색','1000원')
apple1.howtoeat()

사과 클래스를 만들고 상속받은 메소드인 howtoeat을 호출해 보았다. 

부모클래스로 부터 상속받은 howtoeat 메소드가 잘 호출되어 "잘 씻어서 먹어야 합니다."라는 문구가 출력된다.

하지만 바나나의 경우에는 씻어 먹는 것이 아닌 껍질을 벗겨 먹어야 한다. 이럴 경우 바나나 클래스에 메소드 오버라이딩을 해준다. 

class Banana(Fruit, Importation):

    def __init__(self,name,taste,color,price, country, number):
        Fruit.__init__(self,name,taste,color,price)
        Importation.__init__(self,country, number)

    def howtoeat(self):
        print("껍질을 벗겨 먹어야 합니다.")

위와 같이 바나나 클래스에 부모클래스와 같은 이름인 howtoeat을 재정의 해주고 바나나에 맞는 문구를 작성해 준다. 

banana1 = Banana('바나나','달콤','노란색','500원','필리핀','592302')
banana1.howtoeat()

바나나 객체를 만든 이후에 howtoeat() 메소드를 호출하니 

부모클래스인 과일 클래스의 메소드가 아닌 자식클래스인 바나나 클래스의 메소드가 호출되는 모습을 볼 수 있다. 

반응형