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.