나는 이렇게 학습한다/Language

Overloading 과 Overriding 을 Python코드로 구현

daco2020 2022. 2. 7. 17:49
반응형

결론

 

'Overriding'은 상속받은 내용을 덮어쓰기
'Overloading'은 다양한 형태의 인수로 동일한 함수를 실행하기

 

쉽게 이해하기위해 범위를 좁혀 말하자면 위와 같다고 할 수 있다.

(실제는 좀 더 넓은 개념으로 생각하면 좋을 것 같다.)

 

 

 

Overriding 예제 코드

# 부모 클래스
class ParentMoney:
    def introduce(self, name):
        self.money = 1000
        self.name = name
        self.word = "어때 부럽지?"
        return f"내 이름은 {self.name}, {self.money}원을 가지고 있지. {self.word}"

# 자식 클래스
class ChildMoney(ParentMoney):
    def introduce(self, name):
        super().introduce(name)
        self.money = 50
        self.name = name
        return f"내 이름은 {self.name}, {self.money}원을 가지고 있지. {self.word}"


parent_object = ParentMoney()
parent_answer = parent_object.introduce("김부모")
print(parent_answer)

child_object = ChildMoney()
child_answer = child_object.introduce("박자식")
print(child_answer)


'''
<결과>
내 이름은 김부모, 1000원을 가지고 있지. 어때 부럽지?
내 이름은 박자식, 50원을 가지고 있지. 어때 부럽지?
'''

이 코드를 보면 부모클래스의 속성을 자식클래스가 상속받고 있다.

 

그리고 자식클래스는 부모클래스와 동일한 함수 'introduce'에 새로운 값을 할당한다.

 

그 결과 self.money는 기존 상속 값을 따르지 않고 50으로 수정되었다.

하지만 새로운 값을 할당하지 않은 self.word의 경우, 상속 값을 그대로 따르는 것을 볼 수 있다.

 

즉, 오버라이딩은 기존 상속 값에 새로 지정한 값을 덮어쓰기 하는 것이고 새로 지정한 값이 없다면 기존 상속 값을 그대로 가진다.

 

 

 

Overloading 예제 코드

class Money:
    def introduce(self, name="익명", money=10):
        self.name = name
        self.money = money
        self.word = "어때 부럽지?"
        return f"내 이름은 {self.name}, {self.money}원을 가지고 있지. {self.word}"


object = Money()
answer1 = object.introduce(name="변덕순")
print(answer1)

answer2 = object.introduce(money=10000)
print(answer2)

answer3 = object.introduce("마동규", 5000)
print(answer3)

answer4 = object.introduce()
print(answer4)


'''
<결과>
내 이름은 변덕순, 10원을 가지고 있지. 어때 부럽지?
내 이름은 익명, 10000원을 가지고 있지. 어때 부럽지?
내 이름은 마동규, 5000원을 가지고 있지. 어때 부럽지?
내 이름은 익명, 10원을 가지고 있지. 어때 부럽지?
'''

Money객체를 만들어 introduce 메서드를 사용할 때,

인수에 대한 기본값을 설정하였으므로 인수를 다양한 형태(여기서는 0개에서 2개까지)로 넣을 수 있다.

 

인수로 어떤 것을 넣어도 introduce 메서드를 사용할 수 있고 거기에 따라 결과 값도 다양하게 얻을 수 있다.

이러한 형태를 Overloading 이라 부른다. 

 

 

오버로딩의 가장 대표적인 예는 print() 라고 할 수 있다. print() 라는 함수에 다양한 자료형을 넣어 출력할 수 있듯이, 유사하지만 다른 여러 종류의 요청들을 하나의 함수로 응답하는 것을 오버로딩으로 볼 수 있다.

 

 


 

 

이러한 오버라이딩과 오버로딩은 객체의 특성 중 하나인 '다형성'과도 관련 되어있다. 

*다형성이란? 상수, 변수, 식, 오브젝트, 함수, 메소드 등이 다양한 자료형(type)에 속하는 것이 허가되는 성질을 가리킨다.

 

 

 

 

 

 

반응형