다형성과 추상 클래스는 객체 지향 프로그래밍에서 중요한 개념입니다. 이들을 사용하면 코드의 유연성과 재사용성을 향상시킬 수 있습니다. 이번 포스트에서는 Python에서 다형성과 추상 클래스를 어떻게 활용하는지 배워보겠습니다.
다형성 (Polymorphism)
다형성은 객체 지향 프로그래밍의 개념으로, 동일한 메서드 이름을 가진 다른 객체들이 다른 방식으로 동작할 수 있는 능력을 가리킵니다. 예를 들어, 여러 종류의 동물을 처리하는 함수가 있다면, 각각의 동물 객체는 같은 메서드를 호출하더라도 각각의 동작을 할 수 있습니다.
Python에서 다형성은 함수 오버로딩이나 인터페이스를 명시적으로 정의하지 않아도 자동으로 구현됩니다. 이는 동일한 메서드 이름을 가진 객체들이 다른 타입을 가지더라도, 해당 객체의 타입에 따라 다른 동작을 할 수 있음을 의미합니다.
class Animal:
def sound(self):
pass
class Dog(Animal):
def sound(self):
return "Bark"
class Cat(Animal):
def sound(self):
return "Meow"
def make_sound(animal):
print(animal.sound())
dog = Dog()
cat = Cat()
make_sound(dog) # Output: Bark
make_sound(cat) # Output: Meow
위 예제에서 Animal
클래스는 추상 클래스로 정의되지 않았지만, Dog
와 Cat
클래스는 이 클래스를 상속받았습니다. make_sound
함수는 동물 객체를 인자로 받아 해당 동물의 소리를 출력합니다. make_sound
함수 내에서 animal.sound()
를 호출하더라도, 실제로 호출되는 메서드는 해당 동물 객체의 sound
메서드입니다.
추상 클래스 (Abstract Class)
추상 클래스는 일반 클래스와 달리 인스턴스를 직접 생성할 수 없는 클래스입니다. 대신, 이 클래스를 상속받은 서브클래스에서 메서드를 구현하도록 강제합니다. 추상 클래스는 추상 메서드를 포함하며, 추상 메서드는 서브클래스에서 반드시 오버라이딩해야 합니다. 이를 통해 어떤 기능을 반드시 구현하도록 강제해 코드의 일관성을 유지할 수 있습니다.
Python에서 추상 클래스를 정의하기 위해서는 abc
(Abstract Base Class) 모듈을 사용해야 합니다.
from abc import ABC, abstractmethod
class Vehicle(ABC):
@abstractmethod
def drive(self):
pass
class Car(Vehicle):
def drive(self):
return "Driving a car"
class Motorcycle(Vehicle):
def drive(self):
return "Riding a motorcycle"
car = Car()
motorcycle = Motorcycle()
print(car.drive()) # Output: Driving a car
print(motorcycle.drive()) # Output: Riding a motorcycle
위 예제에서 Vehicle
클래스는 추상 클래스로 정의되었고, 추상 메서드인 drive
를 포함하고 있습니다. Car
와 Motorcycle
클래스는 Vehicle
클래스를 상속받았으며, drive
메서드를 오버라이딩하여 구현합니다.
주의할 점은 추상 클래스를 상속받은 서브클래스에서는 반드시 추상 메서드를 구현해야 하며, 그렇지 않으면 오류가 발생합니다.
결론
다형성과 추상 클래스는 객체 지향 프로그래밍에서 코드의 유연성과 재사용성을 증가시키는 중요한 개념입니다. Python의 동적 타이핑과 언어의 특성으로 인해 이러한 개념은 자연스럽게 구현됩니다. 코드를 작성할 때, 다형성과 추상 클래스를 적절히 활용하여 유연하고 응집력 있는 코드를 작성해 보세요.