안녕하세요 여러분, 객체지향 프로그래밍(OOP)에서 추상화(Abstraction)와 다형성(Polymorphism) 은 코드를 더 유연하고 확장 가능하게 만드는 핵심 개념입니다. 이번 글에서는 추상화와 다형성 이 무엇인지, 그리고 파이썬에서 어떻게 구현하는지 알아보겠습니다.
추상화(Abstraction)란?
추상화는 불필요한 세부사항을 숨기고, 필요한 기능만 제공하는 개념입니다. 즉, 사용자는 내부 구현을 몰라도 기능을 사용할 수 있도록 하는 것이 추상화입니다.
예제: 자동차 운전
• 자동차를 운전할 때 핸들 조작, 가속 페달 밟기, 브레이크 밟기만 알면 됨
• 내부적으로 엔진이 어떻게 작동하는지, 연료가 어떻게 연소되는지를 몰라도 운전 가능
• 사용자는 필요한 기능만 사용하면 되고, 내부 구현은 숨겨짐
추상 클래스(Abstract Class)
파이썬에서는 abc (Abstract Base Class) 모듈 을 사용하여 추상 클래스를 정의할 수 있습니다.
추상 클래스는 하위 클래스에서 반드시 구현해야 하는 추상 메서드(abstract method) 를 포함합니다.
📌 추상 클래스 기본 구조
from abc import ABC, abstractmethod
class Animal(ABC): # 추상 클래스
@abstractmethod
def make_sound(self):
pass # 반드시 하위 클래스에서 구현해야 함
class Dog(Animal): # 추상 클래스 상속
def make_sound(self):
return "멍멍!"
class Cat(Animal):
def make_sound(self):
return "야옹!"
dog = Dog()
cat = Cat()
print(dog.make_sound()) # ✅ "멍멍!"
print(cat.make_sound()) # ✅ "야옹!"
ABC 클래스를 상속 → 추상 클래스를 정의
@abstractmethod 데코레이터 → 하위 클래스에서 반드시 구현해야 하는 메서드
인터페이스처럼 활용하기
추상 클래스는 인터페이스처럼 사용하여, 특정 기능을 반드시 구현하도록 강제할 수 있음
from abc import ABC, abstractmethod
class Payment(ABC): # 결제 시스템 추상 클래스
@abstractmethod
def pay(self, amount):
pass
class CreditCardPayment(Payment): # 신용카드 결제
def pay(self, amount):
print(f"신용카드로 {amount}원 결제 완료")
class PayPalPayment(Payment): # PayPal 결제
def pay(self, amount):
print(f"PayPal로 {amount}원 결제 완료")
payment1 = CreditCardPayment()
payment1.pay(10000) # ✅ "신용카드로 10000원 결제 완료"
payment2 = PayPalPayment()
payment2.pay(5000) # ✅ "PayPal로 5000원 결제 완료"
Payment 추상 클래스를 통해 결제 시스템의 기본 구조 정의
CreditCardPayment, PayPalPayment 는 반드시 pay() 메서드를 구현해야 함
다형성(Polymorphism)란?
다형성(Polymorphism) 은 하나의 인터페이스로 여러 가지 형태의 객체를 사용할 수 있도록 하는 개념입니다.
즉, 같은 메서드를 여러 클래스에서 다르게 구현할 수 있습니다.
기본적인 다형성 예제
class Bird:
def make_sound(self):
return "짹짹"
class Dog:
def make_sound(self):
return "멍멍"
class Cat:
def make_sound(self):
return "야옹"
animals = [Bird(), Dog(), Cat()]
for animal in animals:
print(animal.make_sound())
# ✅ "짹짹"
# ✅ "멍멍"
# ✅ "야옹"
make_sound() 메서드를 여러 클래스에서 다르게 구현
동일한 인터페이스로 여러 객체를 다룰 수 있음
메서드 오버라이딩(Method Overriding)
부모 클래스에서 정의한 메서드를 자식 클래스에서 재정의(Override)할 수 있음
class Animal:
def make_sound(self):
return "소리 없음"
class Dog(Animal):
def make_sound(self): # 부모 클래스 메서드 재정의
return "멍멍!"
dog = Dog()
print(dog.make_sound()) # ✅ "멍멍!"
✅ 부모 클래스의 make_sound() 메서드를 자식 클래스에서 다르게 구현
연산자 오버로딩(Operator Overloading)
연산자 오버로딩을 통해 객체 간 연산을 커스텀할 수 있음
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)
def __str__(self):
return f"({self.x}, {self.y})"
p1 = Point(2, 3)
p2 = Point(4, 5)
p3 = p1 + p2 # ✅ __add__() 호출
print(p3) # ✅ "(6, 8)"
+ 연산자를 오버로딩하여 객체 간 덧셈 연산 가능
추상화 & 다형성 활용 예제
#동물 소리 시스템
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def make_sound(self):
pass
class Dog(Animal):
def make_sound(self):
return "멍멍!"
class Cat(Animal):
def make_sound(self):
return "야옹!"
class Cow(Animal):
def make_sound(self):
return "음메!"
animals = [Dog(), Cat(), Cow()]
for animal in animals:
print(animal.make_sound())
# ✅ "멍멍!"
# ✅ "야옹!"
# ✅ "음메!"
추상화(Abstraction) 적용 → Animal 클래스를 만들고 make_sound()를 필수 구현하도록 강제
다형성(Polymorphism) 적용 → make_sound() 를 각각 다른 방식으로 구현
#파이썬 #Python #OOP #객체지향프로그래밍 #추상화 #다형성 #PythonOOP #코딩공부 #파이썬강의
BeautifulSoup으로 데이터 추출하기 (0) | 2025.04.26 |
---|---|
웹 스크래핑이란? – 개념과 활용 사례 (0) | 2025.03.20 |
파이썬 배우기: OOP 기본 – 캡슐화 및 상속 (0) | 2025.03.14 |
파이썬 배우기: 정규 표현식(Regex) (0) | 2025.03.12 |
파이썬 배우기: 고차 함수, 클로저 및 데코레이터 완벽 정리 (0) | 2025.03.02 |