메서드 오버라이딩
메서드 오버라이딩(Method Overriding)은 서브 클래스(subclass, 자식 클래스)에서 슈퍼 클래스(superclass, 부모 클래스)의 메서드를 새롭게 정의하는 과정을 의미합니다. 서브 클래스는 슈퍼 클래스의 메서드를 그대로 사용할 수도 있지만, 필요에 따라 해당 메서드의 기능을 변경하고 싶을 때 메서드 오버라이딩을 활용합니다.
예를 들어, 우리가 Animal
이라는 클래스를 가지고 있고, 이 클래스에는 sound
라는 메서드가 있다고 가정해봅시다.
class Animal:
def sound(self):
print("기본 동물 울음 소리, 악!")
class Animal:
def sound(self):
print("기본 동물 울음 소리, 악!")
이제, 이 Animal
클래스를 상속받는 Dog
클래스와 Cat
클래스를 정의하고, sound
메서드를 오버라이드하여 동물별로 다른 소리를 출력하도록 합시다.
class Dog(Animal):
def sound(self):
print("왈왈!")
class Cat(Animal):
def sound(self):
print("냐옹!")
class Dog(Animal):
def sound(self):
print("왈왈!")
class Cat(Animal):
def sound(self):
print("냐옹!")
여기서 Dog
와 Cat
클래스는 sound
메서드를 오버라이드하여 각각의 동물 소리를 출력합니다.
이처럼 자식 클래스는 부모 클래스에서 정의된 메서드의 일반적인 동작 방식이 아닌, 자신만의 독특한 동작 방식을 필요로 할 때가 있습니다. 이럴 때 메서드 오버라이딩을 사용하여 서브 클래스에 맞는 동작을 정의할 수 있습니다.
메서드를 모두 재정의하는 것이 아니라 부모 클래스의 메서드를 확장하여 추가적인 기능을 구현할 수도 있습니다. 예를 들어, 오버라이드된 메서드 내에서 super()
를 사용하여 부모 클래스의 메서드를 호출할 수 있습니다.
class Bird(Animal):
def sound(self):
super().sound()
print("짹짹!")
class Bird(Animal):
def sound(self):
super().sound()
print("짹짹!")
위 코드 super().sound()
처럼 super()
함수로 오버라이드된 메서드 내에서 부모 클래스의 메서드에 접근할 수 있습니다. 이를 통해 부모 클래스의 기능을 확장하거나 수정할 수 있습니다.
이러한 형태는 특히 __init__
에서 많이 사용됩니다.
위 예제에서 Student
클래스는 Person
클래스를 상속받습니다. Student
클래스의 __init__
메서드에서 super().__init__(name)
을 호출함으로써, 부모 클래스인 Person
의 __init__
메서드가 실행되어 self.name
이 초기화됩니다.
이렇게 사용하면 코드의 재사용성이 높아지고, 유지보수가 간편해집니다. Person의 다른 항목이 추가되더라도 Student는 수정하지 않아도 되기 때문입니다.
메서드 오버라이딩이 항상 가능한 것은 아닙니다. 아래와 같은 코드는 허용하지 않습니다.
x = 10
x.__add__ = lambda self, other: 'hello world'
x + x # error, 기본타입은 read only 입니다.
x = 10
x.__add__ = lambda self, other: 'hello world'
x + x # error, 기본타입은 read only 입니다.
def f():
pass
f.__add__ = lambda self, other: 'hello world'
f + f # error, 함수는 더하기를 허락하지 않습니다.
f.__add__(10, 20)
def f():
pass
f.__add__ = lambda self, other: 'hello world'
f + f # error, 함수는 더하기를 허락하지 않습니다.
f.__add__(10, 20)
Python은 메서드 오버로딩을 허용하지 않습니다. 메서드 오버로딩은 클래스 내에서 같은 이름의 메서드를 여러 개 선언하여 다양한 아규먼트에 대응할 수 있게 하는 기법을 의미합니다.
-
연산자 오버라이딩: 부모 클래스에서 정의한 메서드를 자식 클래스에서 변경하는 것
-
연산자 오버로딩: 동일한 이름의 함수를 매개변수에 따라 다른 기능으로 동작하는 것, Python에서는 지원하지 않음
# 주의! python에서는 오버로딩을 허용하지 않습니다. 비슷하게 구현하자면 아래와 같습니다. 각각 다른 함수가 호출되게 하는 기법입니다. class Cal: def add(a): pass def add(a, b): pass def add(a, b, c): pass c = Cal() c.add(10) # add(a) c.add(10, 20) # add(a, b) c.add(10, 20, 30) # add(a, b, c)
# 주의! python에서는 오버로딩을 허용하지 않습니다. 비슷하게 구현하자면 아래와 같습니다. 각각 다른 함수가 호출되게 하는 기법입니다. class Cal: def add(a): pass def add(a, b): pass def add(a, b, c): pass c = Cal() c.add(10) # add(a) c.add(10, 20) # add(a, b) c.add(10, 20, 30) # add(a, b, c)