class Product:
def __init__(self, name, price, inventory):
self.name = name
self.price = price
self.inventory = inventory
def sell(self, quantity):
if quantity <= self.inventory:
self.inventory -= quantity
return quantity * self.price
else:
return "Inventory shortage"
# 인스턴스 생성
product1 = Product("스마트폰", 1000000, 30)
product2 = Product("노트북", 2000000, 20)
# 메소드 사용
revenue = product1.sell(3)
print(revenue) # 3000000
print(product1.inventory) # 27
온라인 쇼핑몰에서 각 상품은 Product 클래스의 인스턴스로 관리될 수 있다. 이 클래스는 상품의 이름, 가격, 재고 수량 등을 속성으로 갖는다.
Vehicle
클래스는 모든 차량에 공통적인 속성과 메소드를 정의한다. 예를 들어, 모든 차량은 브랜드, 모델, 연식 등의 속성을 가질 수 있으며, 차량을 시작하거나 멈추는 기능을 가질 수 있다.
class Vehicle:
def __init__(self, brand, model, year):
self.brand = brand
self.model = model
self.year = year
def start(self):
print(f"{self.model} has started.")
def stop(self):
print(f"{self.model} has stopped.")
Vehicle
클래스를 상속받아 특정 유형의 차량을 나타내는 클래스를 만들 수 있다. 예를 들어, Car
와 Truck
은 Vehicle
의 속성과 메소드를 상속받지만, 각각의 특수한 특성을 추가할 수 있다.
Car
클래스는 Vehicle
의 기능을 상속받고, 승용차에 특화된 기능을 추가할 수 있다.
class Car(Vehicle):
def __init__(self, brand, model, year, seats):
super().__init__(brand, model, year)
self.seats = seats
def play_music(self):
print(f"Playing music in {self.model}.")
Truck
클래스는 Vehicle
의 기능을 상속받으며, 트럭에 특화된 기능을 추가할 수 있다.
class Truck(Vehicle):
def __init__(self, brand, model, year, payload):
super().__init__(brand, model, year)
self.payload = payload
def tow(self):
print(f"{self.model} is towing.")
my_car = Car("Tesla", "Model 3", 2020, 5)
my_truck = Truck("Ford", "F-150", 2019, 1000)
my_car.start() # "Model 3 has started."
my_car.play_music() # "Playing music in Model 3."
my_truck.start() # "F-150 has started."
my_truck.tow() # "F-150 is towing."
이러한 방식으로, 상속을 활용하여 다양한 유형의 차량을 효율적으로 관리하고, 코드의 재사용성을 높일 수 있다. 상속은 공통적인 특성을 가진 여러 객체들을 효율적으로 관리하는 데 있어 핵심적인 역할을 한다.
class BankAccount:
def __init__(self):
self.__balance = 0
def deposit(self, amount):
if amount > 0:
self.__balance += amount
return True
return False
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
return True
return False
def get_balance(self):
return self.__balance
account = BankAccount()
account.deposit(1000)
print(account.get_balance()) # 1000
account.withdraw(500)
print(account.get_balance()) # 500
캡슐화를 통해 계좌의 잔액을 외부의 직접적인 접근으로부터 보호하고, 유효한 거래만 수행할 수 있도록 한다.
class MessageProcessor:
def process(self, message, format_type):
format_type.format(message)
class JSONFormatter:
def format(self, message):
print(f"JSON: {message}")
class XMLFormatter:
def format(self, message):
print(f"XML: {message}")
processor = MessageProcessor()
json_formatter = JSONFormatter()
xml_formatter = XMLFormatter()
processor.process("Hello, World!", json_formatter) # JSON: Hello, World!
processor.process("Hello, World!", xml_formatter) # XML: Hello, World!
다형성을 활용하여 MessageProcessor
클래스가 다양한 형식의 메시지 포맷터와 함께 작동할 수 있도록 한다. 이를 통해 시스템의 유연성을 향상시키고, 새로운 포맷터의 추가를 용이하게 만든다.
# 결제 방식에 대한 추상 클래스 정의
class PaymentProcessor:
def pay(self, amount):
raise NotImplementedError("Each subclass must implement this method")
# 구체적인 결제 방식 클래스 구현
class CreditCardProcessor(PaymentProcessor):
def pay(self, amount):
print(f"Credit card payment: {amount}")
class PayPalProcessor(PaymentProcessor):
def pay(self, amount):
print(f"PayPal payment: {amount}")
class CryptoProcessor(PaymentProcessor):
def pay(self, amount):
print(f"Cryptocurrency payment: {amount}")
# 결제 처리
def process_payment(processor, amount):
processor.pay(amount)
# 사용 예시
credit_card = CreditCardProcessor()
paypal = PayPalProcessor()
crypto = CryptoProcessor()
process_payment(credit_card, 100)
process_payment(paypal, 200)
process_payment(crypto, 300)
온라인 쇼핑몰에서 여러 결제 방식(신용카드, PayPal, 암호화폐 등)을 지원하는 시스템을 구축해 보았다. 이 예시에서 PaymentProcessor
추상 클래스는 결제 방식에 대한 일반적인 틀을 제공하고, 각 결제 방식은 이를 상속받아 구체적인 로직을 구현한다. 이를 통해 결제 방식을 쉽게 추가하거나 변경할 수 있으며, 결제 처리 로직은 결제 방식의 구체적인 세부 사항을 몰라도 동일하게 작동한다.
객체지향 프로그래밍의 이러한 원리들은 실제 개발에서 매우 유용하게 적용될 수 있으며, 소프트웨어의 설계와 유지 보수에 큰 도움을 준다.