내배캠 TIL 16일차

오병택·2025년 3월 11일

내배캠

목록 보기
38/73

학습 요약

키오스크 도전 lv1 다듬기

도전 lv1 키오스크

kiosk 클래스

package com.example.kiosk;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

public class Kiosk {
    private final ShoppingCart shoppingCart = new ShoppingCart();
    private final List<Menu> listMenus = new ArrayList<>();
    private final Scanner sc = new Scanner(System.in);

    public Kiosk () {
        listMenus.add(new Menu("Burgers"));
        listMenus.add(new Menu("Drinks"));
        listMenus.add(new Menu("Desserts"));
    }

    public void start() {
        Menu menu;
        while (true) {
            System.out.println();

            // 메인 메뉴 시작
            System.out.println("[ MAIN MENU" + " ]");
            for (int i = 0; i< listMenus.size(); i++) {
                System.out.println(i+1+"." + " " +listMenus.get(i).getCategory());
            }
            System.out.println("0. 종료      | 종료");
            System.out.println();
            int chooseParentMenu = io("메뉴를 선택해주세요 : ",0,3);
            if (chooseParentMenu == 0) {
                System.out.println("프로그램을 종료합니다");
                break;
            } else {

                menu = listMenus.get(chooseParentMenu - 1);
                System.out.println("선택한 메인메뉴 :  " + chooseParentMenu + ". " + menu.getCategory());
            }
            System.out.println();

            // 부 메뉴 시작
            System.out.println("[ " + menu.getCategory() + "MENU" + " ]");
            menu.showMenuCategory();
            System.out.println("0. 되돌아가기      | 되돌아가기");
            System.out.println();
            int chooseChildMenu = io("메뉴를 선택해주세요 : ",0,4);
            if (chooseChildMenu == 0) {
                System.out.println("되돌아갑니다");
                continue;
            } else {
                System.out.println("선택한 " + menu.getCategory() + "메뉴 :  " + chooseChildMenu + ". " + menu.getMenuItems().get(chooseChildMenu - 1).toString());
                System.out.println();
                System.out.println();

                // 장바구니 추가 및 취소 기능
                System.out.println(menu.getMenuItems().get(chooseChildMenu - 1).toString());
                System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
                System.out.println("1. 확인        2. 취소");
                int chooseShoppingCartMenu = io("번호를 선택해주세요 : ", 1, 2);
                if (chooseShoppingCartMenu == 1) {
                    shoppingCart.addShoppingCart(menu.getMenuItems().get(chooseChildMenu - 1).toString());
                    System.out.println(menu.getMenuItems().get(chooseChildMenu - 1).getName() + "이 장바구니에 추가되었습니다");
                } else {
                    System.out.println("취소되었습니다");
                }
            }

            // 카트 주문 및 취소 기능
            if (!shoppingCart.getShoppingCart().isEmpty()) {
                int chooseOrderMenu;
                System.out.println();
                System.out.println("[ ORDER MENU" + " ]");
                System.out.println("4. Orders       | 장바구니를 확인 후 주문합니다.\n 5. Cancel       | 진행중인 주문을 취소합니다.");
                chooseOrderMenu = io("메뉴를 선택해주세요 : ", 4, 5);
                if (chooseOrderMenu == 4) {
                    System.out.println("[ Orders" + " ]");
                    double sum = 0;
                    for (int i = 0; i < shoppingCart.getShoppingCart().size(); i++) {
                        String[] findPrice = shoppingCart.getShoppingCart().get(i).split("\\|");
                        String[] findPrice1 = findPrice[1].split(" ");
                        double findPrice2 = Double.parseDouble(findPrice1[2]);
                        System.out.println(shoppingCart.getShoppingCart().get(i));
                        sum += findPrice2;
                    }
                    System.out.println();
                    System.out.println("[ Total" + " ]");
                    System.out.println("W " + sum);
                    System.out.println();
                    System.out.println("1. 주문      2. 메뉴판");
                    int chooseOrderAndMenu = io("번호를 선택해주세요 : ", 1, 2);
                    if (chooseOrderAndMenu == 1) {
                        System.out.println("주문이 완료되었습니다. 금액은 W " + sum + " 입니다");
                        shoppingCart.removeShoppingCart();
                        break;
                    } else {
                        System.out.println("메뉴판으로 되돌아갑니다");
                    }
                } else {
                    System.out.println("진행중인 주문을 취소했습니다");
                }
            }
        }
    }

    // 입출력 및 예외처리 메서드
    public int io(String choose, int min,int max) {
        while (true) {
            try {
                while (true) {
                    System.out.print(choose);
                    int input = sc.nextInt();
                    if (input>=min && input<=max) {
                        return input;
                    }else {
                        System.out.println("메뉴의 숫자에서만 골라주세요");
                    }
                }
            }catch (InputMismatchException e){
                System.out.println("숫자만 써주세요");
                sc.nextLine();
            }
        }
    }
}

MenuItem 클래스에서 추가된 부분

@Override
    public String toString() {
        return String.format("%s| W %.1f | %s", this.name, this.price,this.explanation);
    }

ShoppingCart 클래스

package com.example.kiosk;

import java.util.ArrayList;
import java.util.List;

public class ShoppingCart {
     List<String> shoppingCart = new ArrayList<>();
     String name;
     int count;
     int price;

    public ShoppingCart() {
    }

     public void addShoppingCart(String menu) {
         this.shoppingCart.add(menu);
     }

     public List<String> getShoppingCart() {
         return this.shoppingCart;
     }

    public void removeShoppingCart() {
        this.shoppingCart.clear();
    }

}

나머지 클래스들은 변경한 부분이 없어서 따로 넣지 않았다.

어려웠던 부분

  • toString 오버라이딩
  • try-catch문 메서드로 만들어서 중복 로직 제거

해결 방법

결론만 말하자면 튜터님 도움 + Chat Gpt

toString 오버라이딩은 튜터님이 알려주셔서 어느 정도 아 이렇게 쓰는 거구나라는 것을 알았지만 try-catch문 부분은 너무 많이 쓰이고 절차지향적이라 새로 짜거나 기능과 클래스를 최대한 분리하면서 해야 될 것 같다고 하셨다. 그래도 try-catch문을 뺄 수 있을 것 같은데? 하다가 gpt에게 물어보게 되었다.

느낀 점

왜 어려웠을까 생각해보니 잘 안 풀리니까 스트레스를 받아 더 이해가 안 되어서 그런 것 같다. 막상 해보니 막 어렵진 않았다. 그리고 코드로 볼 때 엄청 길어서 난감했는데 이렇게 TIL에 쓰니까 참담하게 기네.. 이게 객체지향? 🙄 절차지향이다.. 솔직히 이건 개선해서 이정도지😂 그 전에는 뭐 말도 안 나오네,, 주석 처리를 하다 보니 메서드로 분리할 것들이 더 있는 것 같아서 내일 이어서 분리해봐야 할 것 같다.

profile
걱정하지 말고 일단 해봐!

0개의 댓글