본문 바로가기
하나. 빅데이터 머신러닝 /> Python

오버로딩, 오버라이딩 개념 비교

by 여기블 2019. 11. 14.
반응형

1. 오버 로딩 (Overloading) 

-> 같은 클래스 내에서 같은 이름의 메소드를 사용 하는 것 

 

즉 이러한 경우에는 메소드의 이름이 중복적으로 겹치게 되면서 매개변수 타입 or 매개변수의 개수에 따라서 선택적으로 메소드를 선택하게 된다. 사실, 파이썬에서는 아예 오버 로딩 기능이 없기 때문에 (가장 마지막에 쓰여지는 메소드만 기능함) 필요 없는 개념이긴 하지만, 다른 개발 툴에서는 이러한 개념도 쓰임으로 알아둘 것! 

 

2. 오버 라이딩 (Overriding) 

-> 부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의 하는 것 

 

직접 코드를 보면서 이해하는 것이 가장 좋을 듯 합니다. 

 

먼저 Shape 라는 부모 클래스를 정의 합니다.  

 

class Shape:
    def __init__(self, x=0, y=0):
        print('Shape__init__호출')
        self.x = x
        self.y = y

    def __repr__(self):
        return f'Shape(x={self.x}, y={self.y})'

    def move(self, dx, dy):
        self.x += dx
        self.y += dy

    def area(self):
        # Shape 객체는 넓이를 계산할 수 없음 /Circle, Rectangle 객체가 각자의 방식으로 하여야 함
        raise NotImplementedError('반드시 override')

    def draw(self):
        print(f'Drawing : {self.area()}')

그리고, 이렇게 자식 클래스를 생성하게 되죠. 

Shape라는 부모 클래스에서는 객체를 정의할 때 필요한 매개변수가, x와 y 두 가지 였다면, 자식 클래스인 Rectangle 클래스에서는 가로길이와 세로 길이인 w와 h 라는 매개변수가 추가로 필요하게 됩니다. 이럴 경우에는 부모 클래스에서 받은 것들을 그대로 상속받아 자식 클래스인 Rectangle 클래스에서 추가로 정의하게 됩니다. 이러한 개념을 override한다라고 표현하는 것 같아요. 

class Rectangle(Shape):

    def __init__(self, w=0, h=0, x=0, y=0):
        print('Rectangle.__init__호출')
        super().__init__(x, y)  # 부모 클래스의 init 호출
        self.w = w
        self.h = h

 

이렇게 두 개의 Class를 만들 때에는 그 쓰임이 크게 보이진 않지만, 하위 클래스가 많으면 많을 수록! 

예를들어 기본 출발 클래스는 원점 (x,y)의 좌표만 표현하는데 반하여 하위 클래스로 사각형, 원, 마름모 등등 다양한 도형의 넓이를 구하고자 한다면 각 도형마다 필요한 수식을 구현하는데 매개변수가 달라질 수 있죠! 이럴 때 꼭 사용이 되는 개념이라는 생각이 들어요!  

 

더불어 변수를 선언하는데에만 사용 되는 것이 아니라, 메소드 단위에서도 오버라이딩이 사용될 수 있습니다. 부모 클래스에서 def area는 따로 정의되지 않았습니다. 하지만 이렇게 메소드 이름을 동일하게 사용하고 자식 Class에서 메소드를 정의해 주면 오버라이딩이 적용되어 각각의 하위 클래스별로 원하는 메소드를 구현할 수 있게 됩니다. 

 

Class Rectangle(Shape):
 
    def __init__(self, w=0, h=0, x=0, y=0):
        print('Rectangle.__init__호출')
        super().__init__(x, y)  # 부모 클래스의 init 호출
        self.w = w
        self.h = h
        # override : 부모 클래스로부터 상속받은 메소드를 자식클래스에서 재정의 하는 것

    def __repr__(self):
        return f'Rectangle (가로 ={self.w}, 가로 = {self.h}, x={self.x}, y={self.y})'

    def area(self):
        return self.w * self.h

 

오버라이딩 사용 시 주의할 점! 

1. 자식 Class에서 __init__메소드를 작성하는 경우에는 파이썬 인터프리터가 부모 클래스의 __init__메소드를 자동으로 호출하지 않음으로 개발자가 메소드를 명시적으로 호출 해주어야 한다! 

댓글