package secondproject;
public class Main {
public static void main(String[] args) {
Kiosk kiosk = new Kiosk();
// 키오스크 시작 메서드 호출
kiosk.start();
// 크기 계산한 메뉴 사이즈 호출하고 사용자 선택받기 메서드 호출하기
System.out.println("[[ Lotteria Menu ]]");
System.out.println();
int totalMenuSize = kiosk.menuSize(); // 메인에서 필요한지 확인
int userChoice = kiosk.getUserChoice();
System.out.println();
}
}
현재 메인 클래스를 실행시켰을 때 상품 리스트는 모두 출력이 되지만, 선택한 상품을 출력하는 로직은 없기 때문에 수정이 필요하다.
To do List
✅ 캡슐화 → (수정 필요)
✅ 메뉴를 모두 한 번에 출력하지 않고, 카테고리 선택하여 출력하기
⬜ 선택한 제품 출력하기
⬜ 장바구니
⬜ 구매하기
public class MenuItem {
// 필드 선언
private String name;
private double price;
private String description;
// 게터
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public String getDescription() {
return description;
}
public class Menu {
public String name;
// 메뉴 항목 저장할 리스트
private List<MenuItem> menuItems; // 객체들의 리스트 (각 카테고리의 메뉴 항목들을 저장)
게터를 통해 값을 반환한 변수를 외부에서 읽어올 수 있게 캡슐화 했다. 세터는 여기서 필요한지 잘 모르겠어서 넣었다가 뺐다
// 세터
// public void setName(String name) {
// this.name = name;
// }
//
// public void setPrice(double price) {
// this.price = price;
// }
//
// public void setDescription(String description) {
// this.description = description;
// }
// 카테고리 배열로 관리
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("유효하지 않은 번호입니다. 1 ~ " + menuSize() + " 사이의 번호만 입력해주세요.");
}
} catch (NumberFormatException a) {
System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
}
} return -1;
}
// 사용자에게 카테고리 번호를 입력받는 메서드
public int getUserCategoryChoice() {
int choice;
while (true) {
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("프로그램을 종료합니다.");
break;
}
if (choice >= 1 && choice <= Categories.length) {
return choice;
} else {
System.out.println("유효하지 않은 번호입니다. 1 ~ " + menuSize() + " 사이의 번호만 입력해주세요.");
}
} catch (NumberFormatException a) {
System.out.println("잘못된 입력입니다. 숫자만 입력해주세요.");
}
}
return choice;
}

for (int i = 0; i < Categories.length(); i++) 여기서 Categories.length() 는 카테고리 배열의 속성이기 때문에
➡️ 배열의 크기를 가져오는 Categories.length 로 수정해서 해결

의도했던 코드의 동작 흐름은 카테고리 선택지 출력 → 카테고리 선택 → 선택한 카테고리의 메뉴만 출력
이었는데 의도치 않게 모든 메뉴가 출력되는 것을 발견..
카테고리 선택 후 해당 메뉴만 출력하는 로직이 없었기 때문이라고 판단
// 카테고리 선택 후 해당 메뉴 출력
public void showMenuByCategory(int categoryChoice) {
Menu selectedMenu = (categoryChoice == 1) ? burgerMenu : drinkMenu;
selectedMenu.printMenuItem();
}
➡️ ? : 이라는 상황연산자를 사용하려 수정 및 해결
(조건) ? 조건이 참일 때 실행할 코드 : 조건이 거짓일 때 실행할 코드
사용자가 1번을 입력하면 참으로 판단 → 버거 메뉴 출력
사용자가 2번을 입력하면 거짓으로 판단 → 음료 메뉴 출력

선택한 카테고리의 메뉴가 중복으로 출력되는 문제를 발견
➡️ getUserChoice 메서드에서 while 문 안에 있던 메뉴 출력하는 로직을 삭제해서 해결

if (choice == 0) {
System.out.println("프로그램을 종료합니다.");
break;
}
➡️ break로 프로그램을 그냥 종료하는 대신, return -1; 적용해서 프로그램 종료 시 choice 값을 반환하도록 수정. while 문의 종료 시에도 똑같이 적용해서 수정해서 해결

카테고리 번호를 입력받는 메서드에서
if (choice == 0) {
System.out.println("프로그램을 종료합니다.");
return -1;
}
➡️ return -1 부분을 `System.exit(0); 으로 수정해서 0번을 입력하면 프로그램을 완전히 종료시키는 방법으로 해결