ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [과제] 키오스크 필수 Lv4
    내일배움캠프/과제 2025. 3. 13. 15:48

    ✅ Lv4. 객체 지향 설계를 적용해 음식 메뉴와 주문 내역 클래스 기반으로 관리

     

    1️⃣ 과제 조건

    • Menu 클래스 생성하기
      • 설명 : MenuItem 클래스를 관리하는 클래스입니다. 예를 들어, 버거 메뉴, 음료 메뉴 등 각 카테고리 내에 여러 MenuItem을 포함합니다.
      • List<MenuItem> 은 Kiosk 클래스가 관리하기에 적절하지 않으므로 Menu 클래스가 관리하도록 변경합니다.
      • 여러 버거들을 포함하는 상위 개념 ‘버거’ 같은 카테고리 이름 필드를 갖습니다.
      • 메뉴 카테고리 이름을 반환하는 메서드가 구현되어야 합니다.
    • 구조 예시
      public static void main(String[] args) {
          // Menu 객체 생성하면서 카테고리 이름 설정
          // Menu 클래스 내 있는 List<MenuItem> 에 MenuItem 객체 생성하면서 삽입
      
          // Kiosk 객체 생성
          // Kiosk 내 시작하는 함수 호출
      }
      
      public class Kiosk {
          start() {
              // 스캐너 선언
              // 반복문 시작
      
              // List와 Menu 클래스 활용하여 상위 카테고리 메뉴 출력
      
              // 숫자 입력 받기
      
              // 입력 받은 숫자가 올바르다면 인덱스로 활용하여 List에 접근하기
                  // List<Menu>에 인덱스로 접근하면 Menu만 추출할 수 있겠죠?
      
              // Menu가 가진 List<MenuItem>을 반복문을 활용하여 햄버거 메뉴 출력
      
              // 숫자 입력 받기
              // 입력 받은 숫자가 올바르다면 인덱스로 활용해서 Menu가 가지고 있는 List<MenuItem>에 접근하기
                  // menu.getMenuItems().get(i); 같은 형식으로 하나씩 들어가서 얻어와야 합니다.
          }
      }
      
      public class Menu {
          // 카테고리 이름 필드 추가
          // MenuItem 클래스를 List로 관리
      
          // List에 포함된 MenuItem을 순차적으로 보여주는 함수
          // List를 리턴하는 함수
      
          // 구조에 맞게 함수를 선언해놓고 가져다 사용하세요.
      }
      
      public class MenuItem {
          // 이름, 가격, 설명 필드 선언하여 관리
      
          // 구조에 맞게 함수를 선언해놓고 가져다 사용하세요.
      }

    2️⃣ 구현 포인트

    1. Menu 클래스 생성

    • Menu 클래스는 MenuItem을 List로 가지고 있고 각 카테고리 별로 구분하기 위해 Category 와 List<MenuItem>으로 구성
    public class Menu {
        private String category;
        private List<MenuItem> menuItems;
    }

     

    2. Main 에서 여러 카테고리에 해당하는 List<Menu> 생성 후 Kiosk 실행

    public class Main {
        public static void main(String[] args) {
    
            // 메뉴 목록
            List<Menu> menuList = new ArrayList<>();
    
            // Burger List
            List<MenuItem> burgerList = new ArrayList<>();
            burgerList.add(new MenuItem("ShackBurger", 6.9 ,"토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
            burgerList.add(new MenuItem("SmokeShack", 8.9 ,"베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
            burgerList.add(new MenuItem("Cheeseburger", 6.9 ,"포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
            burgerList.add(new MenuItem("Hamburger", 5.4 ,"비프패티를 기반으로 야채가 들어간 기본버거"));
            menuList.add(new Menu("Burgers", burgerList));
    
            ...
    
            Kiosk kiosk = new Kiosk(menuList);
            kiosk.start();
        }
    }
    public class Kiosk {
    
        private final List<Menu> menuList;
    
    	public Kiosk(List<Menu> menuList) {
            this.menuList = menuList;
        }
    }

     

    3. 각 카테고리를 먼저 출력하고 카테고리 선택 후 메뉴 선택으로 변경

    • 카테고리 메뉴를 선택하면 get(index)로 메뉴 정보를 가져오고 메뉴 목록에서 또 선택하면 get(index) 하도록 변경
    while (true) {
        try {
            System.out.println("\n[ MAIN MENU ]");
            int i = 1;
            for (Menu menu : menuList) {
                System.out.println(i++ + ". " + menu.getCategory());
            }
            System.out.println("0. 종료\n");
            System.out.print("번호를 선택해주세요 : ");
    
            input = br.readLine();
            menuNo = Integer.valueOf(input);
    
            if (menuNo == 0) {
                break;
            } else if (menuNo > menuList.size()) { // 없는 번호 입력 시 exception
                throw new NumberFormatException();
            }
    
            // 선택한 메뉴 가져오기
            Menu selectMenu = menuList.get(menuNo - 1);
            System.out.printf("\n[ %s MENU ]\n", selectMenu.getCategory().toUpperCase());
            selectMenu.printMenuItemList(); // 메뉴 목록 출력
    
            while (true) {
                try {
                    System.out.print("번호를 선택해주세요 : ");
                    input = br.readLine();
                    menuItemNo = Integer.valueOf(input);
    
                    if (menuItemNo > selectMenu.getMenuItemsSize()) { // 없는 번호 입력 시 exception
                        throw new NumberFormatException();
                    } else if (menuItemNo != 0) {
                        MenuItem selectMenuItem = selectMenu.getMenuItems().get(menuItemNo - 1);
                        System.out.printf("선택한 메뉴 : %s | 가격 : W %s | 설명 : %s \n", selectMenuItem.getMenuNm(), selectMenuItem.getPrice(), selectMenuItem.getDesc());
                    }
    
                    break;
                } catch (NumberFormatException e) {
                    System.out.println("\n! 올바른 번호를 입력해주세요 !\n");
                }
            }
    
        } catch (NumberFormatException e) {
            System.out.println("\n! 올바른 번호를 입력해주세요 !\n");
        }
    }

     

    3️⃣ 최종 코드

    1. Main

    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
        public static void main(String[] args) {
    
            // 메뉴 목록
            List<Menu> menuList = new ArrayList<>();
    
            // Burger List
            List<MenuItem> burgerList = new ArrayList<>();
            burgerList.add(new MenuItem("ShackBurger", 6.9 ,"토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
            burgerList.add(new MenuItem("SmokeShack", 8.9 ,"베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
            burgerList.add(new MenuItem("Cheeseburger", 6.9 ,"포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
            burgerList.add(new MenuItem("Hamburger", 5.4 ,"비프패티를 기반으로 야채가 들어간 기본버거"));
            menuList.add(new Menu("Burgers", burgerList));
    
            // Drink List
            List<MenuItem> drinkList = new ArrayList<>();
            drinkList.add(new MenuItem("Coke", 2.5 ,"탄산이 가득한 코카콜라"));
            drinkList.add(new MenuItem("Cider", 2.5 ,"청량미 넘치는 사이다"));
            drinkList.add(new MenuItem("Lemon juice", 3.0 ,"생과일 레몬이 들어간 레몬 쥬스"));
            drinkList.add(new MenuItem("PowerAde", 3.0 ,"수분을 보충시켜 줄 파워에이드"));
            menuList.add(new Menu("Drinks", drinkList));
    
            // Dessert List
            List<MenuItem> dessertList = new ArrayList<>();
            dessertList.add(new MenuItem("Cheese Cake", 5.0 ,"꾸덕한 치즈가 들어간 치즈 케이크"));
            dessertList.add(new MenuItem("Chocolate cake", 5.5 ,"초코가 흘러내리는 달콤한 초콜릿 케이크"));
            dessertList.add(new MenuItem("IceCream", 3.0 ,"시원한 아이스크림"));
            dessertList.add(new MenuItem("Cookie", 2.0 ,"갓 구운 바삭한 쿠키"));
            menuList.add(new Menu("Desserts", dessertList));
    
            Kiosk kiosk = new Kiosk(menuList);
            kiosk.start();
        }
    }

     

    2. Menu

    import java.util.List;
    
    public class Menu {
    
        private String category;
    
        private List<MenuItem> menuItems;
    
        public Menu(String category, List<MenuItem> menuItems) {
            this.category = category;
            this.menuItems = menuItems;
        }
    
        public String getCategory() {
            return category;
        }
    
        public void setCategory(String category) {
            this.category = category;
        }
    
        public List<MenuItem> getMenuItems() {
            return menuItems;
        }
    
        public void setMenuItems(List<MenuItem> menuItems) {
            this.menuItems = menuItems;
        }
    
        public void printMenuItemList() {
            int i = 1;
            for (MenuItem menuItem : menuItems) {
                System.out.println(i++ + ". " + menuItem.toString());
            }
            System.out.println(String.format("0. %-11s |  뒤로가기\n", "뒤로가기"));
        }
    
        public int getMenuItemsSize() {
            return this.menuItems.size();
        }
    }

     

    3. MenuItem

    public class MenuItem {
    
        private String menuNm; // 메뉴명
    
        private double price; // 가격
    
        private String desc; // 설명
    
        public MenuItem(String menuNm, double price, String desc) {
            this.menuNm = menuNm;
            this.price = price;
            this.desc = desc;
        }
    
        public String getMenuNm() {
            return menuNm;
        }
    
        public void setMenuNm(String menuNm) {
            this.menuNm = menuNm;
        }
    
        public double getPrice() {
            return price;
        }
    
        public void setPrice(double price) {
            this.price = price;
        }
    
        public String getDesc() {
            return desc;
        }
    
        public void setDesc(String desc) {
            this.desc = desc;
        }
    
        @Override
        public String toString() {
            return String.format("%-13s |  W %-4s | %s", menuNm, price, desc);
        }
    }

     

    4. Kiosk

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.List;
    
    public class Kiosk {
    
        private final List<Menu> menuList;
    
        private final BufferedReader br;
    
        public Kiosk(List<Menu> menuList) {
            this.menuList = menuList;
            this.br = new BufferedReader(new InputStreamReader(System.in));
        }
    
        public void start() {
            int menuNo;
            int menuItemNo;
            String input = "";
    
            try {
                while (true) {
                    try {
                        System.out.println("\n[ MAIN MENU ]");
                        int i = 1;
                        for (Menu menu : menuList) {
                            System.out.println(i++ + ". " + menu.getCategory());
                        }
                        System.out.println("0. 종료\n");
                        System.out.print("번호를 선택해주세요 : ");
    
                        input = br.readLine();
                        menuNo = Integer.valueOf(input);
    
                        if (menuNo == 0) {
                            break;
                        } else if (menuNo > menuList.size()) { // 없는 번호 입력 시 exception
                            throw new NumberFormatException();
                        }
    
                        // 선택한 메뉴 가져오기
                        Menu selectMenu = menuList.get(menuNo - 1);
                        System.out.printf("\n[ %s MENU ]\n", selectMenu.getCategory().toUpperCase());
                        selectMenu.printMenuItemList(); // 메뉴 목록 출력
    
                        while (true) {
                            try {
                                System.out.print("번호를 선택해주세요 : ");
                                input = br.readLine();
                                menuItemNo = Integer.valueOf(input);
    
                                if (menuItemNo > selectMenu.getMenuItemsSize()) { // 없는 번호 입력 시 exception
                                    throw new NumberFormatException();
                                } else if (menuItemNo != 0) {
                                    MenuItem selectMenuItem = selectMenu.getMenuItems().get(menuItemNo - 1);
                                    System.out.printf("선택한 메뉴 : %s | 가격 : W %s | 설명 : %s \n", selectMenuItem.getMenuNm(), selectMenuItem.getPrice(), selectMenuItem.getDesc());
                                }
    
                                break;
                            } catch (NumberFormatException e) {
                                System.out.println("\n! 올바른 번호를 입력해주세요 !\n");
                            }
                        }
    
                    } catch (NumberFormatException e) {
                        System.out.println("\n! 올바른 번호를 입력해주세요 !\n");
                    }
                }
                br.close();
            } catch (IOException e) {
                System.out.println("\n! 에러가 발생했습니다 !\n");
            }
            System.out.println("\n프로그램을 종료합니다.");
        }
    }

     

    '내일배움캠프 > 과제' 카테고리의 다른 글

    [과제] 키오스크 도전 Lv1  (0) 2025.03.13
    [과제] 키오스크 필수 Lv5  (1) 2025.03.13
    [과제] 키오스크 필수 Lv3  (0) 2025.03.13
    [과제] 키오스크 필수 Lv2  (1) 2025.03.13
    [과제] 키오스크 필수 Lv1  (0) 2025.03.13
Designed by Tistory.