어제 이해가 된 둥 마는둥 했더니 역시나 이해가 안됐던 것... 그래서 어제 풀었다고 생각했던 그 문제를 다시 해부했다.
2024.08.01 - [Upstage AI Lab 4기 학습일지] - 7/31 학습일지 | 파이썬 클래스 연습문제 1
문제 2. 음식 주문 시스템 만들기
이 시스템은 메뉴를 관리하고, 주문을 받아 처리하는 기능을 가집니다. 여기서는 메뉴 클래스(Menu), 주문 클래스(Order), 그리고 주문 관리 클래스(OrderManager)를 구현합니다.
- Menu 클래스: 음식 이름과 가격을 관리합니다.
- Order 클래스: 특정 메뉴 항목에 대한 주문을 담습니다. 주문 번호와 주문한 메뉴 항목의 리스트를 포함합니다.
- OrderManager 클래스: 모든 주문을 관리합니다. 새 주문을 추가하고, 모든 주문을 보여주는 기능을 가집니다.
차근차근 다시 해보자!!! 먼저 메뉴 클래스를 생성한다. 메뉴 클래스가 생성하는 인스턴스는 모두 메뉴 이름과 가격을 가지고 있다. 이 예시에서는 피자, 파스타, 샐러드를 메뉴 클래스의 객체로 생성했다. 이제 pizza.price를 하면 10이 나온다. pasta.name을 하면 "Pasta"가 출력되고.
### 1. Menu 클래스
class Menu:
def __init__(self, name, price):
self.name = name
self.price = price
pizza = Menu("Pizza", 10)
pasta = Menu("Pasta", 8)
salad = Menu("Salad", 5)
두 번째, Order 클래스를 만들자. Order 클래스에서 인스턴스를 생성할 때에는 주문번호를 무조건 가지고 태어나게 한다. 그래서 init의 (self, order_id)가 들어간다.
예를 들어서
myfirstdish = Order( order_id: 1)
이렇게 만들면, myfirstdish에는 order_id가 1인 주문이고, myfirstdish의 menu 리스트는 비어있는 상태가 할당된다.
이 상태에서 myfirstdish.add_item("김밥")을 입력해준다고 하자. 그럼 myfirstdish의 menu에는 "김밥"이 추가된다.
myfirstdish.menu를 실행시키면 "김밥"이 나온다.
### 2. Order 클래스
class Order:
def __init__(self, order_id):
self.order_id = order_id
self.menu = []
def add_item(self, food):
self.menu.append(food)
Order 클래스 안에 add_item은 주문을 담는 메서드(함수)다. add_item에 ordered를 받는다고 썼는데, 여기서 ordered라는 변수명은 중요하지 않다. 변수명은 아무거나 들어가도 되고, 중요한건 메뉴 리스트에 받은 값을 append 해주는 것!!
만약에 myfirstdish.add_item(pizza)를 넣었을 때, "Pizza"와 가격 10이 나오게 하고 싶다면 menu가 리스트이므로, 리스트 원소를 item으로 받고 item.name, item.price 이렇게 빼줘야 각각 받을 수 있다.
for item in myfirstdish.menu:
print(f"{item.name}: ${item.price}")
어쨌든, Order 클래스가 잘 작동한다. 지금 예시에서는 내가 임의로 myfirstdish라는 객체를 만들어서 Order 클래스가 잘 작동하는지 확인했지만, 실제로는 OrderManager 클래스에서 Order를 관리하기 때문에 OrderManager가 Order 클래스의 인스턴스를 생성하게 해야한다. 이 부분을 염두하고, OrderManager 클래스를 만들어보자!
### 3. OrderManager 클래스
class OrderManager:
def __init__(self):
self.orders = []
self.order_id = 1
def new_order(self):
order = Order(self.order_id)
self.orders.append(order)
self.order_id += 1
return order
def show_all_orders(self):
for order in self.orders:
print(f"Order ID: {order.order_id}")
print("Items Ordered:")
for item in order.menu:
print(f"{item.name}: ${item.price}")
print("")
정말 정말 이해하기 어려웠다ㅠㅠ
OrderManager 클래스에서 객체를 처음 만들 때, (주문 관리자 order_manager를 만든다고 가정하고)
ordermanager는 전체 주문을 담을 리스트를 가지고 있어야 한다. 그래서 self.orders= [ ] 를 초기값 세팅할 때 넣어준다.
order_manager = OrderManager()
#self.orders = [] 의 뜻
#order_manager는 order_manager.orders = [ ] 라는 빈 리스트(주문1, 주문2, ...를 담을 리스트]를 가진다
#order_manager는 OrderManager 클래스 안의 메서드(함수)를 호출할 수 있다.
#order_manager.new_order()
#order_manager.show_all_orders() 이런 식으로
그리고 new_order( ) 메서드를 만들어주는데, 여기서 new_order( )가 Order 클래스의 새로운 인스턴스(order1 첫번째 주문서)를 생성한다. 이 첫번째 주문서 order1 은 Order 클래스가 정의했던 대로, order_id를 무조건 가져야하고 menu라는 빈 리스트를 갖는다. order_id가 처음에 주어져야 하기 때문에 OrderManager 초기값에 order_id=1 을 넣어준다.
def new_order(self):
order = Order(self.order_id)
self.orders.append(order)
self.order_id += 1
return order
order1 = order_manager.new_order()
그러면 이런 식으로 작동한다. 첫 번째 주문이라는 뜻으로 order1 이라는 변수 이름으로 order_manager.new_order( ) 를 할당한다. 그러면 첫 번째 주문 order1 에는 Order 클래스가 만든 새로운 인스턴스가 할당되며, 이 인스턴스의 order_id = 1, menu에는 아무것도 없는 빈 리스트가 들어간다. 그리고 다음 줄로 넘어가서 orders.append(order)이 실행되면, orders라는 전체 주문 리스트에 order(Order 클래스가 만든 인스턴스인 order1을 받음)이 들어간다. 그리고 order_id는 1이 증가해서 다음 new_order( )를 할 때에는 2가 들어가게 한다.
order1이라는 주문이 생성되었으니 이제 메뉴를 넣을 수 있다. add_item은 Order 클래스의 메서드인데, order1이 가진 메뉴 리스트에 음식을 추가한다.
order1 = order_manager.new_order()
order1.add_item(pizza)
order1.add_item(salad)
이제 show_all_orders( ) 메서드만 정의하면 되는데, 이 함수는 orders라는 리스트에 저장된 order1, order2 ... 를 하나씩 꺼내와서 원하는 값을 출력하면 된다.
def show_all_orders(self):
for order in self.orders:
print(f"Order ID: {order.order_id}")
print("Items Ordered:")
for item in order.menu:
print(f"{item.name}: ${item.price}")
print("")
전체 주문 리스트인 orders에서 order를 하나씩 가져온다. order_manager.orders에는 [order1, order2 ... ]가 들어있다(아까 new_order( )를 하면서 orders.append(order)를 했기 때문에)
order1은 다시 반복해서 말하자면, Order 클래스가 생성한 인스턴스인데 order_id와 menu 리스트를 가지고 있다. Order 클래스가 생성한 인스턴스를 지금까지 order 이라는 변수로 받았기 때문에, order.order_id 라고 출력을 해야 order1이 가진 order_id가 출력된다.
그리고 order1이 가진 menu 리스트를 읽기 위해서, menu를 for 문으로 빼내는데, order1 에 pizza와 salad를 집어넣었으니 두 개가 있을 것이다. 그런데 이 두 원소는 Menu라는 클래스에 의해서 다시 pizza.name. pizza.price 로 나누어진다. 이를 출력하기 위해 item으로 받아 item.name, item.price를 한 것!!
전체 코드는 아래와 같다.
### 1. Menu 클래스
class Menu:
def __init__(self, name, price):
self.name = name
self.price = price
### 2. Order 클래스
class Order:
def __init__(self, order_id):
self.order_id = order_id
self.menu = []
def add_item(self, food):
self.menu.append(food)
### 3. OrderManager 클래스
class OrderManager:
def __init__(self):
self.orders = []
self.order_id = 1
def new_order(self):
order = Order(self.order_id)
self.orders.append(order)
self.order_id += 1
return order
def show_all_orders(self):
for order in self.orders:
print(f"Order ID: {order.order_id}")
print("Items Ordered:")
for item in order.menu:
print(f"{item.name}: ${item.price}")
print("")
### 사용 예
# 메뉴 항목 생성
pizza = Menu("Pizza", 10)
pasta = Menu("Pasta", 8)
salad = Menu("Salad", 5)
# 주문 관리자 생성
order_manager = OrderManager()
# 새 주문 생성
order1 = order_manager.new_order()
order1.add_item(pizza)
order1.add_item(salad)
# 또 다른 주문 생성
order2 = order_manager.new_order()
order2.add_item(pasta)
# 모든 주문 보기
order_manager.show_all_orders()
## 아래는 show_all_orders 실행결과
# Order ID: 1
# Items Ordered:
# Pizza: $10
# Salad: $5
# Order ID: 2
# Items Ordered:
# Pasta: $8
'공부방 > Upstage AI Lab 4기' 카테고리의 다른 글
파이썬 클래스 연습문제 3 - 도서관 관리 시스템 만들기 (0) | 2024.08.03 |
---|---|
파이썬 클래스 연습문제 2 - 이제 조금은 알 것 같기도 하다 (0) | 2024.08.02 |
7/31 학습일지 | 파이썬 클래스 연습문제 1 (0) | 2024.08.01 |
7/31 학습일지 | 파이썬 클래스 문제 풀다가 머리 터지는 중 (0) | 2024.08.01 |
7/30 학습일지 | 파이썬 함수 쓸 때 꼭 살펴볼 것 (0) | 2024.07.31 |