네안녕하세요 오늘은 우선 필수과제를 끝내보려합니다
근데 Lv4는 확실히 난이도가 어마무시하더라고요 ㅎㅎ..
어제부터 지금까지 Lv4만붙잡고 한거같습니다..
우선 이렇게 해야되는데요
와 설명만봐도 여태했던거 중에 제일긴거같죠? ㅎㅎ
우선.. 이번엔 완성된 코드부터 보여드리겟습니다..
package org.example.kiosk;
import java.util.List;
public class Menu {
private final String categoryName; // 카테고리 이름
private final List<MenuItem> menuItems; // 메뉴 항목 리스트
// 생성자
public Menu(String categoryName, List<MenuItem> menuItems) {
this.categoryName = categoryName;
this.menuItems = menuItems;
}
// 카테고리 이름 반환
public String getCategoryName() {
return categoryName;
}
// MenuItem 추가
public void addMenuItem(MenuItem item) {
menuItems.add(item);
}
// MenuItem 리스트 반환
public List<MenuItem> getMenuItems() {
return menuItems;
}
// 메뉴 출력
public void printMenu() {
System.out.println("=== " + categoryName + " 메뉴 ===");
for (int i = 0; i < menuItems.size(); i++) {
MenuItem item = menuItems.get(i);
System.out.println((i + 1) + ". " + item.getName() + " | W " + item.getPrice() + " | " + item.getDescription());
}
System.out.println("0.뒤로가기"); //뒤로가기 추가
}
}
새로 만든 클래스 Menu 클래스입니다.
이것으로 원래 Kiosk에서 직접출력하던걸 Menu로 옮겨줫습니다.
package org.example.kiosk;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
//List
List<MenuItem> burgerItems = new ArrayList<>();
List<MenuItem> drinkItems = new ArrayList<>();
// Menu 객체 생성을 통해 이름 설정
Menu burgerMenu = new Menu("Burgers", burgerItems);
// Menu 클래스 내 있는 List<MenuItem> 에 MenuItem 객체 생성하면서 삽입
burgerItems.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
burgerItems.add(new MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
burgerItems.add(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
burgerItems.add(new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
// 다른 카테고리 메뉴 추가
Menu drinkMenu = new Menu("Drinks", drinkItems); // "Drinks"라는 이름의 Menu 객체 생성
drinkItems.add(new MenuItem("Lemonade", 3.5, "새콤한 레모네이드"));
drinkItems.add(new MenuItem("Iced Tea", 2.8, "차가운 아이스티"));
// Kiosk 객체 생성
List<Menu> menus = new ArrayList<>();
menus.add(burgerMenu); // Burger 카테고리 추가
menus.add(drinkMenu); // Drink 카테고리 추가
Kiosk kiosk = new Kiosk(menus);
// Kiosk 내 시작하는 함수 호출
kiosk.start();
}
}
그리고 Main 메뉴인데 이번엔 각각 burgerItems,drinkItems로 카테고리를 만들어준후 drink 쪽에 음료수를 추가해줘서
음료수와 햄버거를 카테고리에 각각 넣어주는걸 했습니다.
그리고 Kiosk에서 메뉴를 뽑아갈수있게해줫습니다.
package org.example.kiosk;
public class MenuItem {
//필드
private String name; //이름
private double price; //가격
private String description; //설명
//생성자
public MenuItem(String name, double price, String description){
this.name=name;
this.price=price;
this.description=description;
}
//getter
public String getName(){
return name;
}
public double getPrice() {
return price;
}
public String getDescription(){
return description;
}
}
이렇게 하니 MenuItem은 건드릴게 없더라고요 그래서 그대로둿습니다.
package org.example.kiosk;
import java.util.List;
import java.util.Scanner;
public class Kiosk {
//필드
private final List<Menu> menus;
//생성자
public Kiosk(List<Menu> menus) {
this.menus = menus;
}
//start 함수
public void start() {
//Scanner 사용
Scanner sc = new Scanner(System.in);
//전역변수 choice를 0으로 설정
int choice = 0;
while (true) {
// List와 Menu 클래스 활용하여 상위 카테고리 메뉴 출력
System.out.println("[ MAIN MENU ]");
//for문을 이용해 매뉴 출력
for (int i = 0; i < menus.size(); i++) {
System.out.println((i + 1) + "." + menus.get(i).getCategoryName());
}
System.out.println("0.종료");
System.out.println("번호를 선택해주세요.");
//상위 메뉴 선택
while (true) {
//숫자입력
choice = sc.nextInt();
if (choice == 0) {
// 종료 메시지 출력
System.out.println("키오스크를 종료합니다.");
return; // 첫 번째 루프 종료
}
//선택한 카테고리 출력
if (choice != 0) {
if (choice >= 1 && choice <= menus.size()) {
Menu selectedMenu = menus.get(choice - 1);
selectedMenu.printMenu();
System.out.println("번호를 선택해주세요");
while (true) {
int itemChoice = sc.nextInt();
//매뉴 선택 및 출력
if (itemChoice > 0 && itemChoice <= selectedMenu.getMenuItems().size()) {
MenuItem selectedItem = selectedMenu.getMenuItems().get(itemChoice - 1);//매뉴선택
System.out.println("선택한 메뉴: " + selectedItem.getName());
System.out.println("가격: " + selectedItem.getPrice());
System.out.println("설명: " + selectedItem.getDescription());
break;//메뉴 선택 후 나가기
} else if (itemChoice == 0) {
break;//뒤로가기
} else {
System.out.println("잘못된 입력입니다. 다시 선택해주세요.");
selectedMenu.printMenu(); // 메뉴 재출력
System.out.println("번호를 선택해주세요");
}
}
break; //메뉴 카테고리 선택후 종료
} else {
System.out.println("다시선택해주세요.");
}
}
}
}
}
}
대망의 Kiosk입니다.. 오늘 이녀석이 제일 맘을 썩였습니다..ㅎㅎ
하나를 추가하면 하나가 이상하게 출력되고
하나를 입력하면 하나가 오류나고
어후 힘들어죽겟더라고요
이제 막힌 부분과 해결해나가는 걸 보여드리겟습니다.
처음에
Menu클래스를 만들어줫었는데
이녀석을 이해하는데 시간이 좀걸렸었습니다.
그냥 Menu에 필드를 만들어주면되는거였는데 말이죠 ㅎㅎ
그래서 카테코리 필드와 메뉴 항목 필드를 만들어줫었습니다
그럼 해야될게있죠? 바로 생성자를 만들어주는거였습니다
이젠 필드 및 생성자 만들기는 수월하게 만드는거같습니다.
이제그다음 카테고리 이름을 반환하기위해 get을 써주고
MenuItem리스트를 반환하기위해 get을써줍니다
그런데 하다보니 제가 햄버거를 추가해주는식에 썻던코드
// MenuItem 추가
public void addMenuItem(MenuItem item) {
menuItems.add(item);
}
이녀석을 다른녀석으로 바꿔주면서 필요없어졋단걸 깨닫고 글을 쓰다가 제거를 해줫습니다
그후 메뉴 출력을 Menu 에 넣어주기위해
// 메뉴 출력
public void printMenu() {
System.out.println("=== " + categoryName + " 메뉴 ===");
for (int i = 0; i < menuItems.size(); i++) {
MenuItem item = menuItems.get(i);
System.out.println((i + 1) + ". " + item.getName() + " | W " + item.getPrice() + " | " + item.getDescription());
}
}
}
위와같이 써줫었으나 후에 코드를 다만들고나서
여기의 뒤로가기 키를 Kiosk 클래스에 넣어주려 하였었으나
그럼 너무 복잡해져
메뉴출력에
System.out.println("0.뒤로가기"); //뒤로가기 추가
이렇게 넣어줘서 표기를 하게한후
Kiosk에 0을 누르면 뒤로가기가되게끔 만들었습니다.
그후Main 클래스에 카테고리에 잘 엮어놓고
이제 대망의 Kiosk입니다.
이전에 만들어줫던 Lv3의 Kiosk 클래스 코드를 바꿔는데서부터 버벅이기시작했었는데요
필드로 쓰고있던
private final List<MenuItem> menuItems;
이녀석을 Menu 클래스에 넣어주면서 우린 그럼네안녕하세요 오늘은 우선 필수과제를 끝내보려합니다
근데 Lv4는 확실히 난이도가 어마무시하더라고요 ㅎㅎ..
어제부터 지금까지 Lv4만붙잡고 한거같습니다..



우선 이렇게 해야되는데요
와 설명만봐도 여태했던거 중에 제일긴거같죠? ㅎㅎ
우선.. 이번엔 완성된 코드부터 보여드리겟습니다..
package org.example.kiosk;
import java.util.List;
public class Menu {
private final String categoryName; // 카테고리 이름
private final List<MenuItem> menuItems; // 메뉴 항목 리스트
// 생성자
public Menu(String categoryName, List<MenuItem> menuItems) {
this.categoryName = categoryName;
this.menuItems = menuItems;
}
// 카테고리 이름 반환
public String getCategoryName() {
return categoryName;
}
// MenuItem 추가
public void addMenuItem(MenuItem item) {
menuItems.add(item);
}
// MenuItem 리스트 반환
public List<MenuItem> getMenuItems() {
return menuItems;
}
// 메뉴 출력
public void printMenu() {
System.out.println("=== " + categoryName + " 메뉴 ===");
for (int i = 0; i < menuItems.size(); i++) {
MenuItem item = menuItems.get(i);
System.out.println((i + 1) + ". " + item.getName() + " | W " + item.getPrice() + " | " + item.getDescription());
}
System.out.println("0.뒤로가기"); //뒤로가기 추가
}
}
새로 만든 클래스 Menu 클래스입니다.
이것으로 원래 Kiosk에서 직접출력하던걸 Menu로 옮겨줫습니다.
package org.example.kiosk;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
//List
List<MenuItem> burgerItems = new ArrayList<>();
List<MenuItem> drinkItems = new ArrayList<>();
// Menu 객체 생성을 통해 이름 설정
Menu burgerMenu = new Menu("Burgers", burgerItems);
// Menu 클래스 내 있는 List<MenuItem> 에 MenuItem 객체 생성하면서 삽입
burgerItems.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
burgerItems.add(new MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
burgerItems.add(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
burgerItems.add(new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
// 다른 카테고리 메뉴 추가
Menu drinkMenu = new Menu("Drinks", drinkItems); // "Drinks"라는 이름의 Menu 객체 생성
drinkItems.add(new MenuItem("Lemonade", 3.5, "새콤한 레모네이드"));
drinkItems.add(new MenuItem("Iced Tea", 2.8, "차가운 아이스티"));
// Kiosk 객체 생성
List<Menu> menus = new ArrayList<>();
menus.add(burgerMenu); // Burger 카테고리 추가
menus.add(drinkMenu); // Drink 카테고리 추가
Kiosk kiosk = new Kiosk(menus);
// Kiosk 내 시작하는 함수 호출
kiosk.start();
}
}
그리고 Main 메뉴인데 이번엔 각각 burgerItems,drinkItems로 카테고리를 만들어준후 drink 쪽에 음료수를 추가해줘서
음료수와 햄버거를 카테고리에 각각 넣어주는걸 했습니다.
그리고 Kiosk에서 메뉴를 뽑아갈수있게해줫습니다.
package org.example.kiosk;
public class MenuItem {
//필드
private String name; //이름
private double price; //가격
private String description; //설명
//생성자
public MenuItem(String name, double price, String description){
this.name=name;
this.price=price;
this.description=description;
}
//getter
public String getName(){
return name;
}
public double getPrice() {
return price;
}
public String getDescription(){
return description;
}
}
이렇게 하니 MenuItem은 건드릴게 없더라고요 그래서 그대로둿습니다.
package org.example.kiosk;
import java.util.List;
import java.util.Scanner;
public class Kiosk {
//필드
private final List<Menu> menus;
//생성자
public Kiosk(List<Menu> menus) {
this.menus = menus;
}
//start 함수
public void start() {
//Scanner 사용
Scanner sc = new Scanner(System.in);
//전역변수 choice를 0으로 설정
int choice = 0;
while (true) {
// List와 Menu 클래스 활용하여 상위 카테고리 메뉴 출력
System.out.println("[ MAIN MENU ]");
//for문을 이용해 매뉴 출력
for (int i = 0; i < menus.size(); i++) {
System.out.println((i + 1) + "." + menus.get(i).getCategoryName());
}
System.out.println("0.종료");
System.out.println("번호를 선택해주세요.");
//상위 메뉴 선택
while (true) {
//숫자입력
choice = sc.nextInt();
if (choice == 0) {
// 종료 메시지 출력
System.out.println("키오스크를 종료합니다.");
return; // 첫 번째 루프 종료
}
//선택한 카테고리 출력
if (choice != 0) {
if (choice >= 1 && choice <= menus.size()) {
Menu selectedMenu = menus.get(choice - 1);
selectedMenu.printMenu();
System.out.println("번호를 선택해주세요");
while (true) {
int itemChoice = sc.nextInt();
//매뉴 선택 및 출력
if (itemChoice > 0 && itemChoice <= selectedMenu.getMenuItems().size()) {
MenuItem selectedItem = selectedMenu.getMenuItems().get(itemChoice - 1);//매뉴선택
System.out.println("선택한 메뉴: " + selectedItem.getName());
System.out.println("가격: " + selectedItem.getPrice());
System.out.println("설명: " + selectedItem.getDescription());
break;//메뉴 선택 후 나가기
} else if (itemChoice == 0) {
break;//뒤로가기
} else {
System.out.println("잘못된 입력입니다. 다시 선택해주세요.");
selectedMenu.printMenu(); // 메뉴 재출력
System.out.println("번호를 선택해주세요");
}
}
break; //메뉴 카테고리 선택후 종료
} else {
System.out.println("다시선택해주세요.");
}
}
}
}
}
}
대망의 Kiosk입니다.. 오늘 이녀석이 제일 맘을 썩였습니다..ㅎㅎ
하나를 추가하면 하나가 이상하게 출력되고
하나를 입력하면 하나가 오류나고
어후 힘들어죽겟더라고요
이제 막힌 부분과 해결해나가는 걸 보여드리겟습니다.
처음에
Menu클래스를 만들어줫었는데

이녀석을 이해하는데 시간이 좀걸렸었습니다.
그냥 Menu에 필드를 만들어주면되는거였는데 말이죠 ㅎㅎ
그래서 카테코리 필드와 메뉴 항목 필드를 만들어줫었습니다
그럼 해야될게있죠? 바로 생성자를 만들어주는거였습니다
이젠 필드 및 생성자 만들기는 수월하게 만드는거같습니다.
이제그다음 카테고리 이름을 반환하기위해 get을 써주고
MenuItem리스트를 반환하기위해 get을써줍니다
그런데 하다보니 제가 햄버거를 추가해주는식에 썻던코드
// MenuItem 추가
public void addMenuItem(MenuItem item) {
menuItems.add(item);
}
이녀석을 다른녀석으로 바꿔주면서 필요없어졋단걸 깨닫고 글을 쓰다가 제거를 해줫습니다
그후 메뉴 출력을 Menu 에 넣어주기위해
// 메뉴 출력
public void printMenu() {
System.out.println("=== " + categoryName + " 메뉴 ===");
for (int i = 0; i < menuItems.size(); i++) {
MenuItem item = menuItems.get(i);
System.out.println((i + 1) + ". " + item.getName() + " | W " + item.getPrice() + " | " + item.getDescription());
}
}
}
위와같이 써줫었으나 후에 코드를 다만들고나서

여기의 뒤로가기 키를 Kiosk 클래스에 넣어주려 하였었으나
그럼 너무 복잡해져
메뉴출력에
System.out.println("0.뒤로가기"); //뒤로가기 추가
이렇게 넣어줘서 표기를 하게한후
Kiosk에 0을 누르면 뒤로가기가되게끔 만들었습니다.
그후Main 클래스에 카테고리에 잘 엮어놓고
이제 대망의 Kiosk입니다.
이전에 만들어줫던 Lv3의 Kiosk 클래스 코드를 바꿔는데서부터 버벅이기시작했었는데요
필드로 쓰고있던
private final List<MenuItem> menuItems;
이녀석을 Menu 클래스에 넣어주면서 우린 그럼이제
Menu에서 Main 클래스에있는 주문목록들을 뽑아와 Kiosk에 넣어줘야하니
그것을위해서 Kiosk필드에 Menu의 리스트를 뽑아 menus에 넣어준것이죠
그후 생성자를 만들어주고
이제 고비였던 start 함수 부분입니다.
우선 이부분은 do-while문을 쓰고있었는데요
do-while문을 쓰면서
// List와 Menu 클래스 활용하여 상위 카테고리 메뉴 출력
System.out.println("[ MAIN MENU ]");
이렇게 맨위에 MAIN MENU 부분이 올라오게해준뒤
for문을 이용해
//for문을 이용해 매뉴 출력
for (int i = 0; i < menus.size(); i++) {
System.out.println((i + 1) + "." + menus.get(i).getCategoryName());
}
System.out.println("0.종료");
System.out.println("번호를 선택해주세요.");
처음 카테고리목록을 출력하면서 menus의 사이즈 크기만큼 출력하게하였습니다.
package org.example.kiosk;
import java.util.List;
import java.util.Scanner;
public class Kiosk {
//필드
private final List<Menu> menus;
//생성자
public Kiosk(List<Menu> menus) {
this.menus = menus;
}
//start 함수
public void start() {
//Scanner 사용
Scanner sc = new Scanner(System.in);
//전역변수 choice를 0으로 설정
int choice = 0;
do {
// List와 Menu 클래스 활용하여 상위 카테고리 메뉴 출력
System.out.println("[ MAIN MENU ]");
//for문을 이용해 매뉴 출력
for (int i = 0; i < menus.size(); i++) {
System.out.println((i + 1) + "." + menus.get(i).getCategoryName());
}
System.out.println("0.종료");
System.out.println("번호를 선택해주세요.");
//숫자입력
choice = sc.nextInt();
//선택한 카테고리 출력
if (choice != 0) {
if (choice >= 1 && choice <= menus.size()) {
Menu selectedMenu = menus.get(choice - 1);
selectedMenu.printMenu();
System.out.println("번호를 선택해주세요");
int itemChoice = sc.nextInt();
//매뉴 선택 및 출력
if (itemChoice >= 0 && itemChoice <= selectedMenu.getMenuItems().size()) {
MenuItem selectedItem = selectedMenu.getMenuItems().get(itemChoice - 1);//매뉴선택
System.out.println("선택한 메뉴: " + selectedItem.getName());
System.out.println("가격: " + selectedItem.getPrice());
System.out.println("설명: " + selectedItem.getDescription());
} else {
System.out.println("다시선택해주세요.");
}
} else {
System.out.println("다시선택해주세요.");
}
}
} while (choice != 0); //choice가 0이아니면 반복
System.out.println("키오스크를 종료합니다");
}
}
그후 위에처럼
해줫는데 처음엔 if(choice<5)로 설정해줘서
그냥 메뉴 최대 5개만 해서 간단하게 만들어주려했지만
이렇게하면 9를 누르면 에러가뜨는걸 확인했습니다 .
그래서 아이렇게 하면 엉뚱한 숫자를 누르면 뒤로가게끔 만들기 힘들겠구나라고 생각을하고 && 그리고를 사용해서
size를 만들어줫습니다.
그후 Menu selectedMenu = menus.get(choice)를하니 1번을누르니 2번이 나오고 2번을 누르니 3번이나오는걸확인후
-1을 해줫습니다
그후 selectedMenu.printMenu(); 이코드로 인해
public void printMenu() {
System.out.println("=== " + categoryName + " 메뉴 ===");
for (int i = 0; i < menuItems.size(); i++) {
MenuItem item = menuItems.get(i);
System.out.println((i + 1) + ". " + item.getName() + " | W " + item.getPrice() + " | " + item.getDescription());
}
이렇게 매인에있는 printMenu가 출력되게해줫죠
이렇게 나오게한것입니다. 아직 0.뒤로가기는 구현전이였죠
그후 번호를 누르게 끔 int 를넣어주고
if문으로 내가선택한 번호의 음식 이름 가격 설명이 나오게끔 코드를 짜주고 0이 아니면 코드가 다시 반복하게 해줫습니다
여기까진 이제 좀 버벅이면서 고치고 지우고 다시짜고 하면서 딱히 큰오류없이 만들었는데
이제 0.뒤로가기 이녀석을 만드는데부터 문제가 생기기시작했습니다.
아 이제 다만들었네 0.뒤로가기만 해보자 하고있는데
아무리해도 감이안잡히는것입니다.
그래서 아이건 혼자못하겟다..
하고 튜터님께 가보니 do-while문을 while 문으로 바꿔야할거같다 하셧습니다.
그래서 while(true)문으로 바꾸고 아래
else if (itemChoice == 0) {
break;//뒤로가기
와
else {
System.out.println("다시선택해주세요.");
이렇게 써줫더니 문제가생겻었습니다
바로
시작하면
이렇게 보여야하는게 번호를 선택해달라고만 나오는문제였죠
그래서
Menu selectedMenu = menus.get(choice - 1);
selectedMenu.printMenu();
System.out.println("번호를 선택해주세요");
이코드를 위에올려주고 whil(true)를 한번더씌워줫는데
이렇게하니
여기에 이렇게 매뉴를 선택끝났음 다시 MAIN MENU에 가야되지만
다시 번호를 선택해주세요가 나오기는것입니다.
그래서 아래 break를 한번더해주고
} else {
System.out.println("잘못된 입력입니다. 다시 선택해주세요.");
selectedMenu.printMenu(); // 메뉴 재출력
System.out.println("번호를 선택해주세요");
이렇게 메뉴를 제출력시켜주니 잘나오기시작한것이죠
그런데이제또
마지막에
System.out.println("다시선택해주세요.");
이것이 오류가 계속떠서 주석처리해놧었는데 이녀석 까지 위에 코드덕에 한번에 처리를했습니다.
그후
이제 코드를 처음부터 뒤집어 깐이유인 0을누르면 뒤로가게 하는것이였죠
else if (itemChoice == 0) {
break;//뒤로가기
단 이코드 하나를위해 한거였는데요
이렇게해서 뒤로가기를만들고
이렇게만 만들어놓으면 0을 누르면 뒤로가지는걸 모르게 되겠죠?
그래서 이걸 어디다 넣어야하나 하고 Kiosk안에서만 찾으면서 하는데
점점 일이 커지기만 하는것입니다
그래서
Menu를드가서
printMenu에
System.out.println("0.뒤로가기"); //뒤로가기 추가
이걸 넣어주면서 처리가된것을볼수있으십니다.
5단계하기에 너무늦은시간이되었는데요
나머진 주말동안 해버리겟습니다 감사합니다~
'과제를하면서 트러블슈팅' 카테고리의 다른 글
일정 관리 앱 만들기 (0) | 2025.02.03 |
---|---|
키오스크 만들기 Lv5 (2) | 2025.01.20 |
키오스크 만들기 Lv3 (0) | 2025.01.16 |
키오스크 만들기 (3) | 2025.01.15 |
클래스 구현실습 (4) | 2025.01.14 |