객체 지향 프로그래밍(OOP)
의 핵심 개념으로, 코드의 유연성과 재사용성을 높이기 위해 사용코드 예시:
class Car:
def start_engine(self):
pass
def stop_engine(self):
pass
def drive(self):
pass
클래스가 특정 기능을 수행하도록 강제
from abc import ABC, abstractmethod
class PaymentProcessor(ABC):
@abstractmethod
def process_payment(self, amount):
pass
추상 클래스와 인터페이스:
공통된 목적:
구현 강제:
from abc import ABC, abstractmethod
# 인터페이스 정의
class PaymentProcessor(ABC):
@abstractmethod
def process_payment(self, amount):
pass
# 추상 클래스 정의
class OnlinePaymentProcessor(PaymentProcessor):
def authenticate(self):
print("Authenticating online payment")
# 구체 클래스 정의
class CreditCardProcessor(OnlinePaymentProcessor):
def process_payment(self, amount):
self.authenticate()
print(f"Processing credit card payment of {amount}")
# 사용 예시
processor = CreditCardProcessor()
processor.process_payment(100)
PaymentProcessor
는 인터페이스OnlinePaymentProcessor
는 추상 클래스CreditCardProcessor
는 구체 클래스: 실제 결제 처리 로직을 구현from abc import ABC, abstractmethod
class PaymentProcessor(ABC):
@abstractmethod
def process_payment(self, amount):
pass
class CreditCardProcessor(PaymentProcessor):
def process_payment(self, amount):
print(f"Processing credit card payment of {amount}")
class PayPalProcessor(PaymentProcessor):
def process_payment(self, amount):
print(f"Processing PayPal payment of {amount}")
def process_transaction(processor: PaymentProcessor, amount):
processor.process_payment(amount)
# 사용 예시
credit_card_processor = CreditCardProcessor()
paypal_processor = PayPalProcessor()
process_transaction(credit_card_processor, 100)
process_transaction(paypal_processor, 200)
PaymentProcessor
는 추상 클래스이며, 모든 결제 프로세서는 이를 상속받아야 합니다.process_payment
메서드는 모든 하위 클래스에서 구현되어야 함. process_transaction
함수는 변경할 필요가 없습니다.class Logger:
def log(self, message):
print(f"Log: {message}")
# 사용 예시
logger = Logger()
logger.log("This is a log message.")
# 초기 구현
class EmailNotifier:
def send_notification(self, message):
print(f"Sending email notification: {message}")
# 확장 후 추상화 도입
from abc import ABC, abstractmethod
class Notifier(ABC):
@abstractmethod
def send_notification(self, message):
pass
class EmailNotifier(Notifier):
def send_notification(self, message):
print(f"Sending email notification: {message}")
class SMSNotifier(Notifier):
def send_notification(self, message):
print(f"Sending SMS notification: {message}")
def notify_user(notifier: Notifier, message):
notifier.send_notification(message)
# 사용 예시
email_notifier = EmailNotifier()
sms_notifier = SMSNotifier()
notify_user(email_notifier, "Hello via Email!")
notify_user(sms_notifier, "Hello via SMS!")
EmailNotifier
클래스만 존재했지만, 나중에 Notifier
추상 클래스를 도입하고 SMSNotifier
를 추가하여 확장성을 높였습니다.process_payment
메서드를 구현해야 할 때 인터페이스를 사용할 수 있음from abc import ABC, abstractmethod
class PaymentProcessor(ABC):
@abstractmethod
def process_payment(self, amount):
pass
class CreditCardProcessor(PaymentProcessor):
def process_payment(self, amount):
print(f"Processing credit card payment of {amount}")
class PayPalProcessor(PaymentProcessor):
def process_payment(self, amount):
print(f"Processing PayPal payment of {amount}")
def process_transaction(processor: PaymentProcessor, amount):
processor.process_payment(amount)
# 사용 예시
credit_card_processor = CreditCardProcessor()
paypal_processor = PayPalProcessor()
process_transaction(credit_card_processor, 100)
process_transaction(paypal_processor, 200)
여기서 PaymentProcessor
는 인터페이스 역할을 하며, CreditCardProcessor
와 PayPalProcessor
는 이를 구현합니다. process_transaction
함수는 어떤 결제 수단이 오더라도 동일한 방식으로 결제를 처리할 수 있습니다.
class Storage(ABC):
@abstractmethod
def save(self, data):
pass
@abstractmethod
def load(self):
pass
class FileStorage(Storage):
def save(self, data):
with open('data.txt', 'w') as file:
file.write(data)
def load(self):
with open('data.txt', 'r') as file:
return file.read()
class DatabaseStorage(Storage):
def save(self, data):
# 데이터베이스에 저장하는 로직
pass
def load(self):
# 데이터베이스에서 로드하는 로직
pass
def store_data(storage: Storage, data):
storage.save(data)
# 사용 예시
file_storage = FileStorage()
store_data(file_storage, "Example data")
이 예제에서 Storage
인터페이스는 파일 저장소와 데이터베이스 저장소가 동일한 메서드를 구현하도록 강제합니다. 이를 통해 시스템의 일관성을 유지할 수 있습니다.
class Logger:
def log(self, message):
print(f"Log: {message}")
# 사용 예시
logger = Logger()
logger.log("This is a log message.")
여기서는 Logger
클래스 하나만으로 충분하며, 인터페이스를 사용하지 않아도 됩니다.
def calculate_sum(a, b):
return a + b
# 사용 예시
result = calculate_sum(3, 4)
print(result)
이 예제에서는 간단한 덧셈 함수를 구현하는 데 인터페이스가 필요하지 않습니다.