-
[과제] 키오스크 필수 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 - Menu 클래스 생성하기