[파이썬] 오버라이딩의 의미와 활용

오버라이딩(overriding)은 객체 지향 프로그래밍에서 중요한 개념 중 하나입니다. 이는 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하여 다른 동작을 수행할 수 있게 해줍니다. 오버라이딩을 통해 코드의 재사용성을 높일 수 있으며, 클래스 간의 유연한 상속 관계를 지원할 수 있습니다.

오버라이딩의 의미

오버라이딩은 부모 클래스에서 이미 구현된 메서드를 자식 클래스에서 동일한 이름으로 재정의하는 것입니다. 부모 클래스의 메서드를 자식 클래스에서 오버라이딩하면 자식 클래스의 인스턴스에서 해당 메서드를 호출하게 되면 부모 클래스의 메서드 대신 자식 클래스에서 재정의한 메서드가 호출됩니다. 이를 통해 자식 클래스는 부모 클래스의 기능을 수정하거나 확장할 수 있습니다.

오버라이딩의 활용

오버라이딩은 다양한 상황에서 유용하게 활용될 수 있습니다. 몇 가지 예시를 살펴보겠습니다.

1. 다형성(polymorphism) 구현

오버라이딩을 사용하면 부모 클래스의 인스턴스를 자식 클래스의 인스턴스로 대체하여 다형성을 구현할 수 있습니다. 예를 들어, 동물을 나타내는 Animal 클래스가 있고, Dog 클래스와 Cat 클래스가 Animal 클래스를 상속받는다고 가정해보겠습니다. Animal 클래스에는 make_sound 메서드가 있지만, 각각의 자식 클래스에서 이 메서드를 오버라이딩하여 동물마다 다른 소리를 낼 수 있도록 할 수 있습니다.

class Animal:
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        print("멍멍!")

class Cat(Animal):
    def make_sound(self):
        print("야옹!")

animals = [Dog(), Cat()]
for animal in animals:
    animal.make_sound()  # 다른 동물마다 다른 소리 출력

2. 부모 클래스의 기능 수정

오버라이딩을 사용하면 부모 클래스의 메서드를 수정하여 자식 클래스에 맞게 변경할 수 있습니다. 예를 들어, 원의 넓이를 계산하는 기능을 가진 Circle 클래스가 있고, 이를 상속받아 반지름이 0 이하인 경우에는 0을 반환하도록 수정하고자 한다면, Circle 클래스의 area 메서드를 오버라이딩할 수 있습니다.

import math

class Circle:
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return math.pi * self.radius * self.radius

class ModifiedCircle(Circle):
    def area(self):
        if self.radius <= 0:
            return 0
        else:
            return super().area()

circle1 = Circle(5)
circle2 = ModifiedCircle(-2)

print(circle1.area())  # 출력: 78.53981633974483
print(circle2.area())  # 출력: 0

위의 예시에서 ModifiedCircle 클래스에서 area 메서드를 오버라이딩하여 반지름이 0 이하인 경우에는 0을 반환하도록 변경했습니다.

결론

오버라이딩은 객체 지향 프로그래밍에서 중요한 개념 중 하나로, 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하여 다른 동작을 수행할 수 있습니다. 이를 통해 코드의 재사용성을 높이고, 클래스 간의 유연한 상속 관계를 지원할 수 있습니다.