본문 바로가기

Programing/Python

[Python 입문] 14. 파이썬 오버라이딩과 오버로딩

 앞서 클래스에 대해 배우면서 오버라이딩(Overriding)과 오버로딩(Overloading)에 대해 나왔었다. 오버라이딩과 오버로딩은 이름에서부터 비슷한 것 같지만 사실은 완전 다른 두 가지 개념이다.

 

목차

  • 오버라이딩(Overriding)
  • 오버로딩(Overloading)

1. 오버라이딩(Overriding)

 프로그래밍에서의 오버라이딩을 쉽게 설명하면 클래스(Class)의 상속 시 "부모 Class에서 정의한 메소드를 자식 Class에서 변경하는 것"을 말한다. 부모 Class의 메소드 이름과 기본적인 기능은 그대로 사용하지만, 아래와 같이 특정 기능을 바꾸고 싶을 때 자주 사용한다.

class HousePark:
    lastname = "박"
    def __init__(self, name):
        self.fullname = self.lastname + name
    def travel(self,where):
        print("{0}, {1}여행을 가다." .format(self.fullname, where))
    def love(self, other):
        print("{0}, {1} 사랑에 빠졌네." .format(self.fullname, other.fullname))
    def __add__(self, other):
        print("{0}, {1} 결혼했네." .format(self.fullname, other.fullname))


class HouseKim(HousePark):   <---- 기본적인 HousePark의 모든 기능 상속
    lastname = "김"
    def travel(self, where, day):
        print("{0}, {1}여행 {2}일 가네." .format(self.fullname, where, day))

 위의 소스코드를 보면 HouseKim 클래스는 기본적으로 HousePark 클래스의 모든 기능(__init__, travel, love, __add__)을 상속한다. 즉, 같은 기능의 사용을 위해 반복적인 작성 등 따로 입력하지 않아도 자동적으로 상속된다는 것이다. 하지만 travel 함수는 HouseKim 클래스에 맞게 수정을 한다는 뜻이다.

 

 

2. 오버로딩(Overloading)

 파이썬에서는 오버로딩을 정식으로 지원하지 않는다. 하지만 구현은 가능하지만 오버로딩을 남발하면 코드가 복잡해지고 난해해진다. 하지만 꼭 필요한 기능이기도 하다.

 프로그래밍에서의 오버로딩은 동일한 이름의 함수를 매개변수에 따라 다른 기능으로 동작하도록 할 수 있게 한다.

 

 오버로딩과 오버라이딩을 비교하면 오버라이딩이 클래스의 상속 시에 클래스를 수정하는 것이라면 오버로딩은 하나의 메소드에게 다형성을 부여하는 것이다.

 이 오버로딩을 활용하면 메소드를 작성할때 매개 변수의 숫자에 제한이 없기 때문에 사실상 같은 이름으로 동작하는 무수히 많은 메소드를 짤 수 있다.

 

 파이썬에서는 연산자 오버로딩을 사용할 경우가 많이 있는데 이는 연산자(더하기, 빼기, 나누기, 곱하기)를 객체끼리 사용할 수 있게 하는 기법으로 연산자 오버로딩을 사용하면 아래와 같이 동작하도록 할 수 있다.

class HousePark:
    lastname = "박"
    def __init__(self, name):
        self.fullname = self.lastname + name
    def __add__(self, other):   <---- 연산자 오버로딩 사용
        print("{0}, {1} 결혼했네." .format(self.fullname, other.fullname))


class HouseKim(HousePark):
    lastname = "김"
    def travel(self, where, day):
        print("{0}, {1}여행 {2}일 가네." .format(self.fullname, where, day))


pey = HousePark("응용")
juliet = HouseKim("줄리엣")
print(pey + juliet)   <---- 연산자 오버로딩 호출

박응용, 김줄리엣 결혼했네.

 

 아직 복잡하고 조금 이해가 어려운 부분이 있다... 더 공부해야 할 것 같다...