Vending Machine Class
3주차 수업에서는 Python 으로 객체지향을 구현해 보았습니다.
class Item:
def __init__(self, name, price, number=0, count=0):
# Class나 Function에서 내부 구현 없이 이름을 전달해줄 필요가 있을 때 사용 (코드 작성시 제거)
self.name = name
self.price = price
self.number = number
self.count = count
def __lt__(self, item1):
return self.price < item1.price
def __add__(self, item1):
combo_name = f"{self.name} + {item1.name}"
combo_price = (self.price + item1.price)*0.9
return Item(combo_name, combo_price)

Operator overloading is a feature in object-oriented programming languages that allows you to define multiple behaviors for a single operator based on the types of its operands. This means that you can use operators like +, -, *, /, and others to perform custom operations on objects of user-defined classes.
위의 설명처럼, 연산에 대한 작업을 Class의 메서드로 정의하면,
Item1 + Item2, Item1*Item2, Item1>Item2 와 같이 연산자를 인스턴스 사이에 사용할 수 있습니다.
class VendingMachine:
def __init__(self):
self.item_list = []
self.input_money = 0
# 자판기에서 판매할 제품 등록 (제품명, 가격, 번호)
def initialize(self):
number = 1
print("1. 제품 등록")
print("-" * 70)
while True:
# 제품명과 가격을 입력할 때 콤마(,)를 사용하여 구분
# Item 클레스의 인스턴스를 생성하여 제품명, 가격, 번호를 기입한 후 item_list 리스트에 저장
inputStr = input("자판기에서 판매할 제품의 제품명과 제품가격 입력(종료시 0 입력) : ")
if inputStr == "0":
break
name, price = inputStr.split(",")
price = float(price)
item = Item(name,price,number)
self.item_list.append(item)
number += 1
print("제품 등록 완료")
print("-" * 70)
print('\n')
# Operator Overloading을 활용하여 두 개 제품의 조합을 생성 (가격은 10% 할인 적용)
# 추가된 제품의 number는 0번으로 설정
def add_combo_menu(self):
combo_list = []
for item1 in self.item_list:
for item2 in self.item_list:
if item1.number < item2.number:
combo_item = item1+item2
combo_item.number = 0
combo_list.append(combo_item)
self.item_list += combo_list
# Operator Overloading을 활용하여 제품의 가격을 기준으로 오름차순 정렬
# 오름차순으로 정렬된 제품 순서대로 1번부터 number를 설정
def numbering(self):
self.item_list.sort()
number = 1
for item in self.item_list:
item.number = number
number += 1
# 자판기에서 판매하는 제품 목록 확인
def show_menu(self):
print("2. 제품 목록 확인")
print("-" * 70)
for item in self.item_list:
print("번호: {}, 제품명: {}, 가격: {}".format(item.number,item.name,item.price))
print("-" * 70)
print('\n')
# 현금 투입
def insert_money(self):
print("3. 현금 투입")
print("-" * 70)
while True:
money = input("투입할 금액(종료시 0 입력) : ")
if money == "0":
break
self.input_money += int(money)
print("총 투입 금액 : {}".format(self.input_money))
print("-" * 70)
print('\n')
# 제품 구매
def buy_item(self):
print("4. 제품 구매")
print("-" * 70)
while True:
num = input("제품 번호 선택(종료시 0 입력) : ")
if num == "0":
break
num = float(num)
selected_item = None
for item in self.item_list:
if item.number == num:
selected_item = item
break
selected_item.count += 1
self.input_money -= selected_item.price
print("{} 구입완료".format(selected_item.name))
print("남은잔액: {}".format(self.input_money))
print('\n')
print("-" * 70)
print('\n')
# 구매 목록 및 남은 잔액 출력
def receipt(self):
print("5. 구매 목록")
print("-" * 70)
for item in self.item_list:
if item.count > 0:
print("{}: {}개 구입".format(item.name,item.count))
print("거스름돈: {}원".format(self.input_money))
print("-" * 70)

1. Initialize

2. Add Combo Menu
3. Numbering
4. Show Menu

5. Insert Money

6. Buy Item

7. Receipt
