본문 바로가기
Python/Python 고급

Python 파이썬, Class 메서드 오버라이딩

by 베타코드 2022. 3. 22.
반응형

안녕하세요 독학코딩입니다. 오늘은 파이썬 Class의 메서드 오버라이딩에 대해서 배워보겠습니다. 저번 시간에 우리는 아래의 Class 예제로 공부하였습니다.

 

class My_class(): 
    def add(self, numA, numB): 
        return numA + numB 

    def subtract(self, numA, numB): 
        return numA - numB

위 처럼 이미 만들어진 클래스를 이용하는데 특수한 경우 오류가 발생하면 어떻게 해야될까요?? 아니면 기존의 클래스를 조금만 수정해서 사용하고 싶을 땐 어떻게 해야될까요? 아래와 같은 예시를 생각 해봅시다.

 

test_a = My_class()
test_add = test_a.add(4, "2")
print(test_add)

어떤 오류가 발생하였나요? 당연하겠지만, TypeError: unsupported operand type(s) for +: 'int' and 'str'가 발생하였을 겁니다. 프로그래밍을 하다보면 매우 흔한 경우입니다. 이미 생성해둔 클래스가 매우 특수한 경우에 오류가 발생하는 경우 말입니다.

 

이럴때 클래스 자체를 수정해서 오류를 수정할 수도 있지만, 이런 특수한 예외적인 경우는 메서드 오버라이딩으로 해결할 수도 있습니다.

 

더보기

실질적으로 이렇게 하는 경우가 더 많습니다. 위 예시 처럼 짧은 클래스라면 클래스 자체를 수정하겠지만 보통 프로그래밍에서 말하는 클래스란 수 천, 수 만줄 짜리라서 클래스 자체 수정이 힘듭니다.

class My_class_override(My_class):
    def add(self, numA, numB):
        if type(numA) != int():
            try:
                numA = int(numA)
            except:
                return "주어진 값이 숫자가 아닙니다."

        if type(numB) != int():
            try:
                numB = int(numB)
            except:
                return "주어진 값이 숫자가 아닙니다."

        return numA + numB

My_class()에서 특정 메소드만 오버라이딩(수정)하려면 위와 같이 하면 됩니다. 클래스 상속을 하듯이 새로운 클래스 class My_class_override를 선언하고 인자로써 (My_class)를 작성해주면 됩니다. 그리고 오버라이드할 매서드 def add(self, numA, numB):를 새롭게 작성해주시면 됩니다.

 

전체 코드는 아래와 같습니다.

class My_class():
    def add(self, numA, numB):
        return numA + numB

    def subtract(self, numA, numB):
        return numA - numB

class My_class_override(My_class):
    def add(self, numA, numB):
        if type(numA) != int():
            try:
                numA = int(numA)
            except:
                return "주어진 값이 숫자가 아닙니다."

        if type(numB) != int():
            try:
                numB = int(numB)
            except:
                return "주어진 값이 숫자가 아닙니다."

        return numA + numB


test_a = My_class_override()
test_add = test_a.add(4, "5")
print(test_add)
test_subtract = test_a.subtract(4, 2)
print(test_subtract)

위의 예제를 실행해보시면 아시겠지만, 오버라이딩한 add()는 새로운 메소드로 실행되고 오버라이딩 하지 않은 substract()는 기존의 메소르도 실행됩니다.

반응형

댓글