-
[과제] 키오스크 필수 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 ListList<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()) { // 없는 번호 입력 시 exceptionthrow 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()) { // 없는 번호 입력 시 exceptionthrow 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 ListList<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 ListList<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 ListList<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;}@Overridepublic 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()) { // 없는 번호 입력 시 exceptionthrow 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()) { // 없는 번호 입력 시 exceptionthrow 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 클래스 생성하기