★ 모든 메뉴를 클래스로 할당할 경우 단점 : 메모리를 많이 먹음(인스턴스화 할 때) 장점 : 부모 클래스의 특성이 추가 될 경우(예 : 버거 클래스만 패티 굽기 정도를 추가) 수정이 편함
★ 메뉴 클래스와 메뉴아이템 클래스만 둘 경우
단점 : 버거만 특성이 추가 될 경우 수정 어려움
장점 : 메모리 많이 안 먹음
**클래스 2가지만 생성**
private void initializeMenuItems() {
List<Menu> mainMenus = new ArrayList<>();
mainMenus.add(new Menu("Burgers", "앵거스 비프 통살을 다져만든 버거"));
mainMenus.add(new Menu("Frozen Custard", "매장에서 신선하게 만드는 아이스크림"));
mainMenus.add(new Menu("Drinks", "매장에서 직접 만드는 음료"));
mainMenus.add(new Menu("Beer", "뉴욕 브루클린 브루어리에서 양조한 맥주"));
List<Menu> orderMenus = new ArrayList<>();
orderMenus.add(new Menu("Order", "장바구니를 확인 후 주문합니다."));
orderMenus.add(new Menu("Cancel", "진행중인 주문을 취소합니다."));
orderMenus.add(new Menu("Order List", "대기/완료된 주문목록을 조회합니다."));
menus.put("Main", mainMenus);
menus.put("Order", orderMenus);
List<Item> burgersMenus = new ArrayList<>();
burgersMenus.add(new Item("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
burgersMenus.add(new Item("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
burgersMenus.add(new Item("Shroom Burger", 9.4, "몬스터 치즈와 체다 치즈로 속을 채운 베지테리안 버거"));
burgersMenus.add(new Item("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
burgersMenus.add(new Item("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
List<Item> frozenCustardMenu = new ArrayList<>();
frozenCustardMenu.add(new Item("Frozen Custard Menu Item 1", 1.4, "Frozen Custard Menu Item 1 설명"));
frozenCustardMenu.add(new Item("Frozen Custard Menu Item 2", 1.0, "Frozen Custard Menu Item 2 설명"));
frozenCustardMenu.add(new Item("Frozen Custard Menu Item 3", 1.6, "Frozen Custard Menu Item 3 설명"));
frozenCustardMenu.add(new Item("Frozen Custard Menu Item 4", 2.1, "Frozen Custard Menu Item 4 설명"));
List<Item> drinksMenu = new ArrayList<>();
drinksMenu.add(new Item("Drinks Menu Item 1", 1.0, "Drinks Menu Item 1 설명"));
drinksMenu.add(new Item("Drinks Menu Item 2", 1.0, "Drinks Menu Item 2 설명"));
List<Item> beerMenu = new ArrayList<>();
beerMenu.add(new Item("Beer Menu Item 1", 3.0, "Beer Menu Item 1 설명"));
beerMenu.add(new Item("Beer Menu Item 2", 4.0, "Beer Menu Item 2 설명"));
menuItems.put("Burgers", burgersMenus);
menuItems.put("Frozen Custard", frozenCustardMenu);
menuItems.put("Drinks", drinksMenu);
menuItems.put("Beer", beerMenu);
}
class Menu {
static int idSeq = 1;
int id;
String name;
String description;
Menu(String name, String description) {
this.id = idSeq++;
this.name = name;
this.description = description;
}
}
inputMyInfo()
함수에서 **burgerList()
**를 호출할 때 OrderManager
객체를 전달fun inputMyInfo() {
**val orderManager = OrderManager() // OrderManager 객체 생성**
while (true) {
when (inputInfo("selectNumber")) {
1 -> burgerList**(orderManager)** // burgerList() 호출 시 OrderManager 객체 전달
class OrderManager {
private val orderList: MutableList<MenuItem> = mutableListOf()
**private fun sum(): Int {
var sumPrice = 0
for (menuItem in orderList) {
sumPrice += menuItem.price
}
return sumPrice
}
private fun payment() {
val sumPrice = sum()
println("[ 주문 내역 ]")
for ((index, menuItem) in orderList.withIndex()) {
println("[${index + 1}] ${menuItem.name} | W ${menuItem.price} | ${menuItem.introduce}")
}
println("[ 합계 금액 ]")
println("W $sumPrice")**
}
}
return
대신에 order()
메소드를 재귀적으로 호출. displayOrder()
메소드 내에서 return order()
대신에 order()
메소드를 호출하도록 수정class OrderManager {
private val orderList: MutableList<MenuItem> = mutableListOf()
fun addToOrder(menuItem: MenuItem) {
orderList.add(menuItem)
println("주문 내역에 ${menuItem.name}가 추가 되었습니다.")
order()
}
private fun order() {
if (orderList.isEmpty()) {
println("주문 내역이 비어있습니다.")
} else {
println("[ 주문 내역 ]")
for ((index, menuItem) in orderList.withIndex()) {
println("[${index + 1}] ${menuItem.name} | W ${menuItem.price} | ${menuItem.introduce}")
}
}
println("[ ORDER MENU ]")
println("[5] 결제")
println("[6] 주문 취소")
println("[7] 메뉴 더 담기")
val selectNumber = readLine()?.toIntOrNull()
when (selectNumber) {
5 -> payment()
6 -> clearOrder()
7 -> inputMyInfo()
else -> {
println("올바른 메뉴 번호를 선택하세요.")
**order() // 잘못된 입력 시 다시 order() 메소드 호출 (재귀 호출)**
}
}
}
}