Shake Shack Burger 키오스크 프로그래밍


★ 모든 메뉴를 클래스로 할당할 경우 단점 : 메모리를 많이 먹음(인스턴스화 할 때) 장점 : 부모 클래스의 특성이 추가 될 경우(예 : 버거 클래스만 패티 굽기 정도를 추가) 수정이 편함

★ 메뉴 클래스와 메뉴아이템 클래스만 둘 경우

단점 : 버거만 특성이 추가 될 경우 수정 어려움

장점 : 메모리 많이 안 먹음

**클래스 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;
	}
}
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")**
    }
}
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() 메소드 호출 (재귀 호출)**
            }
        }
    }
}