1. 오버라이딩
파이썬에서 오버라이딩(Overriding)은 객체 지향 프로그래밍에서 중요한 개념 중 하나로, 하위 클래스(subclass)에서 상위 클래스(superclass)의 메서드를 다시 장의 하는 것을 의미한다. 이것은 상속을 통해 부모 클래스로부터 상속받은 메서드를 하위 클래스에서 필요에 맞게 재정의할 수 있게 해 준다.
오버라이딩의 주요 특징은 다음과 같다.
특징 |
내용 |
상속 관계 |
오버라이딩은 상속 관계에서 발생하며, 하위 클래스가 상위 클래스를 다시 정의한다. |
메서드 시그니처 일치 |
오버라이딩된 메서드의 이름, 매개변수 및 반환 유형은 원본 메서드와 정확하게 일치해야 한다. |
동적 디스패치 |
런타임 시에 객체의 실제 형식에 따라 적절한 오버라이딩된 메서드가 호출된다. 이것은 다형성의 핵심 원리 중 하나이다. |
2. 오버라이딩 예제
오버라이딩(Overriding) 예제를 살펴보기 위해 간단한 클래스를 사용해 보자. 아래의 코드에서는 부모 클래스와 그를 상속하는 자식 클래스를 정의하고, 자식 클래스에서 부모 클래스의 메서드를 오버라이딩한다.
예제 코드 1
class Animal:
def speak(self):
print("동물이 소리를 냅니다.")
class Dog(Animal):
def speak(self):
print("멍멍")
class Cat(Animal):
def speak(self):
print("야옹")
# 객체 생성
my_dog = Dog()
my_cat = Cat()
# 오버라이딩된 메서드 호출
my_dog.speak()
my_cat.speak()
멍멍
야옹
실행 결과
Animal 클래스에는 speak 메서드가 정의되어 있고 Dog 클래스와 Cat 클래스는 각각 Animal 클래스를 상속하여, speak() 메서드를 오버라이딩하여 동작을 수행한다. my_dog와 my_cat 객체를 생성하고 각 객체의 speak() 메서드를 호출하면 각 클래스의 오버라이딩된 버전이 실행된다.
이것은 파이썬에서 오버라이딩을 구현하는 간단한 예제이다. 하위 클래스에서 상위 클래스의 메서드를 재정의하여 자식 클래스의 고유한 동작을 제공할 수 있다.
예제 코드 2
import math
class Shape:
def area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * self.radius ** 2
# 객체 생성
rect = Rectangle(4, 5)
circle = Circle(3)
# 각 객체의 넓이 계산 및 출력
print(f"사각형의 넓이: {rect.area()}")
print(f"원의 넓이: {circle.area()}")
사각형의 넓이: 20
원의 넓이: 28.274333882308138
실행 결과
Shape 클래스에는 추상 메서드 area가 정의되어 있고 이 메서드는 하위 클래스에서 오버라이딩되어야 한다. 따라서, Rectangle 및 Circle 클래스는 Shape 클래스를 상속하고, 각 클래스에서 area() 메서드를 오버라이딩하여 해당 도형의 넓이를 계산하는 동작을 제공한다. 그리고 rect와 circle 객체를 생성하고, 각 객체의 area() 메서드를 호출하여 각 도형의 넓이를 계산하고 출력한 걸 확인할 수 있다.
이 예제에서 오버라이딩을 사용하여 추상적인 Shape 클래스에서 파생된 클래스에서 고유한 동작을 구현하였다. 이는 객체 지향 프로그래밍의 다형성을 활용한 강력한 패턴 중 하나이다.