< 중간 점검 후의 To do List >
✅ 캡슐화 → (수정 필요)
✅ 메뉴를 모두 한 번에 출력하지 않고, 카테고리 선택하여 출력하기
✅ 선택한 제품 출력하기
⬜ 카테고리 선택 옵션에 [ ORDER MENU ] 추가
◻️ 1번, 2번, 0번 카테고리 옵션 출력과 함께 아래 옵션 추가
◻️ 3. Orders | 장바구니를 확인 후 주문합니다.
◻️ 4. Cancel | 진행중인 주문을 취소합니다.
⬜ 장바구니
◻️ 선택한 메뉴 장바구니에 담기 (추가 / 취소)
◻️ '추가' 입력 시 추가된 제품 정보 출력 & ORDER MENU (장바구니 목록) 함께 출력
☑️ '취소' 입력 시 다시 메뉴 출력하고 메뉴 선택 입력 받기
⬜ 구매하기
package secondproject;
import java.util.ArrayList;
import java.util.List;
public class MenuItem {
// 필드 선언
private final String name;
private final double price;
private final String description;
// 게터
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public String getDescription() {
return description;
}
// 메뉴 아이템을 생성할 때 생성하는 생성자
// MenuItem 객체를 생성할 때 이름, 가격, 설명을 받아서 필드에 저장
public MenuItem(String name, double price, String description) {
this.name = name;
this.price = price;
this.description = description;
}
// 버거 항목을 리스트에 추가하는 메서드
public static List<MenuItem> BurgerMenu() { // 버거 메뉴 항목들을 생성하여 List<MenuItem> 형태로 반환
List<MenuItem> Burgers = new ArrayList<>(); // 여러 가지 버거 메뉴를 생성하여 리스트에 추가
Burgers.add(new MenuItem("Bulgogi Burger", 4.7, "마요네즈, 양파, 레터스, 불고기소스, 불고기패티가 토핑된 불고기버거"));
Burgers.add(new MenuItem("Shrimp Burger", 4.7, "타르타르 소스, 새우 패티, 양상추, 사우전드 아일랜드 드레싱이 토핑된 새우버거"));
Burgers.add(new MenuItem("Cheese Burger", 5.2, " 머스타드 소스, 마요네즈, 저민 양파, 저민 피클, 치즈, 쇠고기 패티가 토핑된 치즈버거"));
Burgers.add(new MenuItem("Chicken Burger", 4.0, "닭다리살패티, 데리야키소스, 양상추, 마요네즈, 머스타드가 토핑된 치킨버거"));
Burgers.add(new MenuItem("Hanwoo Bulgogi Burger", 8.6, "마요네즈, 양파, 레터스, 불고기소스, 한우패티로 구성된 한우불고기버거"));
return Burgers; // 위에서 추가한 메뉴들을 리스트에 반환
}
// 음료 항목을 리스트에 추가하는 메서드
public static List<MenuItem> DrinkMenu() {
List<MenuItem> Drinks = new ArrayList<>();
Drinks.add(new MenuItem("Pepsi Cola", 2.0, "콜라"));
Drinks.add(new MenuItem("Pepsi Cola Zero Sugar", 2.0, "제로 콜라"));
Drinks.add(new MenuItem("Chilsung Cider", 1.7, "사이다"));
Drinks.add(new MenuItem("Cafe Americano", 2.5, "아메리카노"));
Drinks.add(new MenuItem("Lemonade", 2.7, "레몬에이드"));
return Drinks;
}
}
// ================= To do List =================
// 세부 메뉴 속성 가지는 클래스
// List를 선언하여 여러 메뉴 추가 -> List<MenuItem> menuItems = new ArrayList<>();
// 이름, 가격, 설명 필드 선언하여 관리
// 구조에 맞게 함수를 선언해놓고 가져다 사용
// ================= 수정 과정에서 뺀 메서드 =================
// 세터
// public void setName(String name) {
// this.name = name;
// }
//
// public void setPrice(double price) {
// this.price = price;
// }
//
// public void setDescription(String description) {
// this.description = description;
// }
// =====================================================
package secondproject;
import java.util.List;
public class Menu {
public String name;
public double price;
// 메뉴 항목 저장할 리스트
private List<MenuItem> menuItems; // 객체들의 리스트 (각 카테고리의 메뉴 항목들을 저장)
// 게터
public List<MenuItem> getMenuItems() {
return menuItems;
}
// 생성자 (메뉴 항목 받아서 각 카테고리의 메뉴 항목 초기화)
public Menu(String name) { // 메뉴 객체 생성할 때 카테고리 이름 받아오기
this.name = name;
// 메뉴 항목 리스트 불러오기
if (name.equals("버거 메뉴")) {
this.menuItems = MenuItem.BurgerMenu();
} else if (name.equals("음료 메뉴")) {
this.menuItems = MenuItem.DrinkMenu();
}
}
// 메뉴 항목 출력 메서드
public void printMenuItem() {
System.out.println("[ " + name + " ]");
for (int i = 0; i < menuItems.size(); i++) {
MenuItem items = menuItems.get(i);
System.out.println((i + 1) + ". " + items.getName() + " | " + items.getPrice() + " | " + items.getDescription());
}
}
// 메뉴 크기 계산 메서드
// 해당 메뉴의 항목 개수를 반환하기 위해
public int MenuSize() {
return menuItems.size();
}
}
// ================= To do List =================
// MenuItem 클래스를 관리하는 클래스
// 카테고리 이름 필드 추가 -> 버거 메뉴, 음료 메뉴, 디저트 메뉴 등 각 카테고리 내에 여러 MenuItem 을 포함
// MenuItem 클래스를 List로 관리
// Menu 객체 생성하면서 카테고리 이름 설정 (버거, 음료, 디저트 등등)
// Menu 클래스 내 있는 List<MenuItem> 에 MenuItem 객체 생성하면서 삽입
// List에 포함된 MenuItem을 순차적으로 보여주는 함수
// List를 리턴하는 함수
// 구조에 맞게 함수를 선언해놓고 가져다 사용
// ================= 수정 과정에서 뺀 메서드 =================
// 메뉴 총 크기 계산 메서드
// public static int TotalMenuSize(Menu burgerMenu, Menu drinkMenu) {
// return burgerMenu.MenuSize() + drinkMenu.MenuSize();
// }
// =====================================================
package secondproject;
import java.util.Scanner;
public class Kiosk {
Scanner sc = new Scanner(System.in);
// 키오스크 시작 메서드
public void start() {
System.out.println("키오스크를 시작합니다.");
System.out.println();
}
// 카테고리 배열로 관리
private final String[] Categories = {"버거 메뉴", "음료 메뉴"};
// 각 카테고리의 Menu 객체 생성
Menu burgerMenu = new Menu("버거 메뉴");
Menu drinkMenu = new Menu("음료 메뉴");
// 사용자에게 카테고리 번호를 입력받는 메서드
public int getUserCategoryChoice() {
int choice;
while (true) {
System.out.println("[[ Lotteria Menu ]]");
System.out.println();
System.out.println("[ 카테고리 ]");
// 카테고리 선택지 출력
for (int i = 0; i < Categories.length; i++) {
System.out.println("[ " + (i + 1) + ". " + Categories[i] + " ]");
}
System.out.println("[ 0. 종료 ]");
System.out.println("원하는 카테고리의 번호를 입력해주세요: ");
String input = sc.nextLine();
try {
choice = Integer.parseInt(input);
if (choice == 0) {
System.out.println("프로그램을 종료합니다.");
System.exit(0);
}
if (choice >= 1 && choice <= Categories.length) {
// 카테고리 선택 후 해당 카테고리 출력하는 연산 로직
// 상황 연산자(? :) → (조건) ? 조건이 참일 때 실행할 코드 : 조건이 거짓일 때 실행할 코드
Menu SelectedCategory = (choice == 1) ? burgerMenu : drinkMenu;
// choice가 1이면 참 → 버거메뉴 출력, 2면 거짓 → 음료 메뉴 출력
// 선택된 카테고리 출력
SelectedCategory.printMenuItem();
break; // 선택이 완료되면 반복문 종료
} else {
System.out.println("유효하지 않은 번호입니다. 선택지 중에서 번호를 골라 입력해주세요.");
System.out.println();
}
} catch (NumberFormatException a) {
System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
System.out.println();
}
}
return -1;
}
// 메뉴 항목 배열로 관리
// private final String[] MenuDetails = {"버거 메뉴", "음료 메뉴"};
//
// // 각 카테고리의 Menu 객체 생성
// Menu burgerMenuDetail = new Menu("버거 메뉴");
// Menu drinkMenuDetail = new Menu("음료 메뉴");
// 사용자에게 메뉴 번호를 입력받는 메서드
public int getUserChoice() {
int choice;
while (true) {
// 번호 입력 받기
System.out.println();
System.out.println("원하는 제품의 번호를 입력해주세요 (0을 입력하면 종료): ");
String input = sc.nextLine();
try {
// 입력 받은 (문자 형태)숫자를 숫자로 인식하기 위해 형 변환
choice = Integer.parseInt(input);
// 0 입력시 종료
if (choice == 0) {
System.out.println("프로그램을 종료합니다.");
System.exit(0);
}
if (choice > 0 && choice <= burgerMenu.MenuSize()) {
// 선택된 제품 출력하는 연산 로직
MenuItem selectedMenu = burgerMenu.getMenuItems().get(choice - 1); // 0부터 시작하기 때문에 -1
printSelectedMenu(selectedMenu);
} else if (choice > 0 && choice <= drinkMenu.MenuSize()) {
MenuItem selectedMenu = drinkMenu.getMenuItems().get(choice - 1);
printSelectedMenu(selectedMenu);
} else { // 메뉴 번호가 유효한지 확인
System.out.println("유효하지 않은 번호입니다. 선택지 중에서 번호를 골라 입력해주세요.");
}
} catch (NumberFormatException a) {
System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
}
}
}
// 선택한 메뉴를 출력하는 메서드
public void printSelectedMenu(MenuItem selectedMenu) {
System.out.println("선택한 메뉴는 다음과 같습니다:");
System.out.println("메뉴명: " + selectedMenu.getName());
System.out.println("가격: " + selectedMenu.getPrice());
System.out.println("상세정보: " + selectedMenu.getDescription());
System.out.println();
}
}
// ================= To do List =================
// 프로그램 순서 및 흐름 제어를 담당하는 클래스
// 키오스크 실행 시 콘솔에 햄버거 메뉴 (with 선택번호) 출력, 종료 (with 선택번호) 함께 출력
// 사용자에게 숫자를 입력 받아 메뉴를 선택, 0을 입력하면 프로그램 종료
// 예외처리는 오류메시지 출력
// 스캐너 선언
// 반복문 시작
// List와 Menu 클래스 활용하여 상위 카테고리 메뉴 출력
// 카테고리 숫자 입력 받기
// 입력 받은 숫자가 올바르다면 인덱스로 활용하여 List에 접근하기
// List<Menu>에 인덱스로 접근하여 Menu만 추출할 수 있도록하기
// Menu가 가진 List<MenuItem>을 반복문을 활용하여 햄버거 메뉴 출력
// 주문할 메뉴 숫자 입력 받기
// 입력 받은 숫자가 올바르다면 인덱스로 활용해서 Menu가 가지고 있는 List<MenuItem>에 접근하기
// menu.getMenuItems().get(i); 같은 형식으로 하나씩 들어가서 얻어오기
// ================= 수정 과정에서 뺀 메서드 =================
// 메뉴 총 크기 메서드 호출
// public int menuSize() {
// return Menu.TotalMenuSize(burgerMenu, drinkMenu);
// }
// =====================================================
package secondproject;
public class Main {
public static void main(String[] args) {
Kiosk kiosk = new Kiosk();
// 키오스크 시작 메서드 호출
kiosk.start();
// 카테고리 선택 메서드 호출
kiosk.getUserCategoryChoice();
// 메뉴 선택 메서드 호출
kiosk.getUserChoice();
System.out.println();
// kiosk.menuSize(); // 메인에서 필요한지 확인
}
}
// ================= To do List =======================
// 시작 지점이 되는 클래스
// Main = User 라고 생각하기 (키오스크 시작하기, 카테고리 선택하기, 결제하기 등)
// Kiosk 객체 생성
// Kiosk 내 시작하는 함수 호출 -> 키오스크 프로그램을 시작하는 메서드 구현하고 -> start 함수 만들어서 관리
// 구현할 것등 : 캡슐화, 장바구니, 구매하기, 선택한 메뉴 출력되기
// =====================================================
※ 추후에 반복되는 로직 모두 간소화 위해 수정 필요

try {
// 입력 받은 (문자 형태)숫자를 숫자로 인식하기 위해 형 변환
choice = Integer.parseInt(input);
// 0 입력시 종료
if (choice == 0) {
System.out.println("프로그램을 종료합니다.");
System.exit(0);
if (choice > 0 && choice <= menuSize()) {
// 선택된 제품 출력하는 연산 로직
MenuItem selectedMenu = burgerMenu.getMenuItems().get(choice - 1);
printSelectedMenu(selectedMenu);
} else {
MenuItem selectedMenu = drinkMenu.getMenuItems().get(choice - burgerMenu.MenuSize() - 1);
printSelectedMenu(selectedMenu);
} break;
// 메뉴 번호가 유효한지 확인
} else {
System.out.println("유효하지 않은 번호입니다. 1 ~ " + menuSize() + " 사이의 번호만 입력해주세요.");
}
} catch (NumberFormatException a) {
System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
}
} return -1;
}
선택한 메뉴 출력하는 로직 구현 과정에서 범위 내의 번호 입력 시에도 "유효하지 않은 번호입니다. 1 ~ 10 사이의 번호만 입력해주세요" 메시지 출력되는 문제 발견
while (true) {
// 번호 입력 받기
System.out.println();
System.out.println("원하는 제품의 번호를 입력해주세요 (0을 입력하면 종료): ");
String input = sc.nextLine();
try {
// 입력 받은 (문자 형태)숫자를 숫자로 인식하기 위해 형 변환
choice = Integer.parseInt(input);
// 0 입력시 종료
if (choice == 0) {
System.out.println("프로그램을 종료합니다.");
System.exit(0);
}
if (choice > 0 && choice <= menuSize()) {
// 선택된 제품 출력하는 연산 로직
MenuItem selectedMenu = burgerMenu.getMenuItems().get(choice - 1);
printSelectedMenu(selectedMenu);
} else if (choice > burgerMenu.MenuSize() && choice <= menuSize()) {
MenuItem selectedMenu = drinkMenu.getMenuItems().get(choice - burgerMenu.MenuSize() - 1);
printSelectedMenu(selectedMenu);
} else { // 메뉴 번호가 유효한지 확인
System.out.println("유효하지 않은 번호입니다. 1 ~ " + menuSize() + " 사이의 번호를 입력해주세요.");
}
} catch (NumberFormatException a) {
System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
}
}
➡️ else if 문으로 수정하여 해결

수정한 뒤에 메뉴 선택 입력 받는 곳에서 범위 밖의 번호 입력 시 예외처리 로직이 제대로 동작하지 않는 문제 발견
➡️ 메뉴 사이즈를 총 메뉴 사이즈가 아닌 각각 메뉴의 사이즈로 수정하여 나머지 예외 수를 처리하는 else문이 제대로 범위 밖의 숫자를 예외처리 할 수 있도록 해결
if (choice > 0 && choice <= burgerMenu.MenuSize())
else if (choice > 0 && choice <= drinkMenu.MenuSize())

"장바구니에 담으시겠습니까? (추가 / 취소)" 라는 문구에 잘못된 문자 입력 시 재질문 하지 않고 제품 선택 로직으로 돌아가는 문제 발견
else {
System.out.println("취소 처리되었습니다.");
System.out.println();
Menu SelectedCategory = (choice == 1) ? burgerMenu : drinkMenu;
SelectedCategory.printMenuItem();
}
➡️ 오류 메시지 출력하고 재질문 하도록 수정.
Menu selectedCategory = (choice == 1) ? burgerMenu : drinkMenu;
selectedCategory.printMenuItem();
else 문 마다 로직 추가해서 해결

카테고리 선택 → 메뉴 입력 창에서 0 입력 시 뒤로가기 동작 → 다시 카테고리 선택 → 메뉴 선택 질문 없이 자동으로 장바구니 로직으로 넘어가는 문제 발견
if (choice >= 1 && choice <= Categories.length) {
// 카테고리 선택 후 해당 카테고리 출력하는 연산 로직
// 상황 연산자(? :) → (조건) ? 조건이 참일 때 실행할 코드 : 조건이 거짓일 때 실행할 코드
Menu selectedCategory = (choice == 1) ? burgerMenu : drinkMenu;
// choice가 1이면 참 → 버거메뉴 출력, 2면 거짓 → 음료 메뉴 출력
// 선택된 카테고리 출력
selectedCategory.printMenuItem();
// 선택된 카테고리의 메뉴로 이동
getUserChoice();
break; // 선택이 완료되면 반복문 종료
➡️ getUserCategoryChoice 메서드의 if 문 안에 getUserChoice(); 로직을 추가하여 선택된 카테고리의 메뉴 출력만 하는 것이 아니라 출력하고 해당 메뉴선택으로 다시 이동하도록 수정

뒤로가기 동작 → 카테고리 선택 → 메뉴 선택 로직에서 오류메시지 함께 출력되는 문제 발견
로직이 끝날 때 값을 반환해주는 return 을 잘 못 넣어주거나 혹은 넣지 않았기 때문에 문제가 발생한다고 판단. 했었는데 잘못된 판단이었다. 문제는 위의 문제와 같은 getUserChoice(); 로직을 넣지 않았기 때문에 선택된 카테고리의 메뉴를 출력만 해주고 메뉴 선택 로직으로 가지 못 했던 이유였다.
➡️ getUserChoice(); 로직 추가함으로써 위의 문제와 함께 해결됨

장바구니 담을지 여부 과정에서 '취소' 입력 → 다시 메뉴 선택으로 돌아가지 않고 자동으로 다른 카테고리 선택되는 문제 발견
else {
System.out.println("취소 처리되었습니다.");
System.out.println();
burgerMenu.printMenuItem();
burgerMenu.getMenuItems();
}
➡️ 오류 메시지 출력하고 재질문 하도록 수정.
burgerMenu.printMenuItem();
burgerMenu.getMenuItems();
drinkMenu.printMenuItem();
drinkMenu.getMenuItems();
위의 에러사항과 비슷한 방법으로 해결. 각 카테고리에 맞는 로직 추가로 선택된 카테고리의 메뉴 다시 출력하고 선택 입력 받도록 수정

카테고리 선택 → '0' 입력 → 다른 카테고리 선택 → 메뉴 선택 → 선택된 카테고리의 메뉴 출력되는 것이 아니라, 처음에 선택한 카테고리의 메뉴 출력되는 문제 발견
➡️ 장바구니 메서드를 따로 만들어야 겠다는 필요성을 느껴서 전체적으로 수정