오류, 기능, 문제해결(JAVA)

키오스크 과제 트러블슈팅

seungmin576 2025. 1. 13. 17:05

2025-01-13

level1

package level1;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("[ SHAKESHACK MENU ]\n" +
                "1. ShackBurger   | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거\n" +
                "2. SmokeShack    | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거\n" +
                "3. Cheeseburger  | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거\n" +
                "4. Hamburger     | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거\n" +
                "0. 종료      | 종료");

        while (true){

            String inputNum = sc.nextLine();

            switch (inputNum){
                case "1" :
                    System.out.println("기능구현1");
                    break;
                case "2" :
                    System.out.println("기능구현2");
                    break;

                case "3" :
                    System.out.println("기능구현3");
                    break;

                case "4" :
                    System.out.println("기능구현4");
                    break;

                case "0" :
                    System.out.println("프로그램을 종료합니다.");
                    break;

                default :
                    System.out.println("잘못입력");
            }

            if("0".equals(inputNum)){
                break;
            }
        }
    }
}

inputNums 변수를 처음엔 int형으로 선언하고 sc.nextInt() 로 초기화했다.

그랬더니 사용자가 문자열을 입력했을때 오류가 나 프로그램이 멈춘다.

String 타입으로 바꾸고 sc.nextLine() 으로 초기화하니 사용자가 아무리 뚱딴지 같은걸 입력해도 오류가 안나고 예외처리가 잘된다.

 


 

level3

package level3;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Kiosk {
    private List<MenuItem> menuList;
    private Scanner sc = new Scanner(System.in);

    public Kiosk(List<MenuItem> menuList) {
        this.menuList = menuList;
    }

    public void start(){
        System.out.println("[ SHAKESHACK MENU ]");  //메뉴 목록 출력
        for (int i = 0; i < menuList.size(); i++) {
            System.out.println((i + 1) + ". " + menuList.get(i));
        }
        System.out.println("0. 종료 | 종료");
        System.out.print("메뉴 선택. 0 부터 4 까지 입력 : ");
        compareInput();
    }

    private void compareInput(){
        List<String> menuName = new ArrayList<>();  //고른 메뉴 이름 저장용
        String inputNum = sc.nextLine();

        while (true){

            switch (inputNum){
                case "1" :
                    menuName.add(menuList.get(0).getFoodName());    //고른 메뉴 저장
                    MenuItem.totalPrice(menuList.get(0).getPrice());    //고른 메뉴 가격 저장
                    break;
                case "2" :
                    menuName.add(menuList.get(1).getFoodName());
                    MenuItem.totalPrice(menuList.get(1).getPrice());
                    break;

                case "3" :
                    menuName.add(menuList.get(2).getFoodName());
                    MenuItem.totalPrice(menuList.get(2).getPrice());
                    break;

                case "4" :
                    menuName.add(menuList.get(3).getFoodName());
                    MenuItem.totalPrice(menuList.get(3).getPrice());
                    break;

                case "0" :
                    System.out.println("프로그램을 종료합니다.");
                    break;

                default :
                    System.out.println("잘못입력");
            }

            printSelectedMenu(menuName);

            if("0".equals(inputNum)){
                System.out.println("프로그램을 종료합니다.");
                break;
            }
        }
    }

    private void printSelectedMenu(List<String> menuName){
        System.out.println("선택한 메뉴 목록");//골랐던 메뉴 이름 출력 반복문
        for (String menu : menuName) {
            System.out.println(menu);
        }
        System.out.println("가격 : " + MenuItem.getTotalPrice()); //골랐던 메뉴 총합 가격
    }

}
  • 문제 : 입력한 번호의 메뉴만 무한 출력함.
  • 원인: 디버깅 결과 inputNum에 사용자가 한번 대입한 값이 영원히 도는 것이었다. 
  • 해결 : while 반복문 안으로 문제의 문장을 가져오니 무한루프가 안일어났다. 반복을 1회 마칠때마다 새로 inputNum을 사용자가 대입할 수 있었다.

 

수정 코드 및 결과

package level3;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Kiosk {
    private List<MenuItem> menuList;
    private Scanner sc = new Scanner(System.in);

    public Kiosk(List<MenuItem> menuList) {
        this.menuList = menuList;
    }

    public void start(){
        System.out.println("[ SHAKESHACK MENU ]");  //메뉴 목록 출력
        for (int i = 0; i < menuList.size(); i++) {
            System.out.println((i + 1) + ". " + menuList.get(i));
        }
        System.out.println("0. 종료 | 종료");
        System.out.print("메뉴 선택. 0 부터 4 까지 입력 : ");
        compareInput();
    }

    private void compareInput(){
        List<String> menuName = new ArrayList<>();  //고른 메뉴 이름 저장용

        while (true){
            String inputNum = sc.nextLine();	//여기로 이동

            switch (inputNum){
                case "1" :
                    menuName.add(menuList.get(0).getFoodName());    //고른 메뉴 저장
                    MenuItem.totalPrice(menuList.get(0).getPrice());    //고른 메뉴 가격 저장
                    break;
                case "2" :
                    menuName.add(menuList.get(1).getFoodName());
                    MenuItem.totalPrice(menuList.get(1).getPrice());
                    break;

                case "3" :
                    menuName.add(menuList.get(2).getFoodName());
                    MenuItem.totalPrice(menuList.get(2).getPrice());
                    break;

                case "4" :
                    menuName.add(menuList.get(3).getFoodName());
                    MenuItem.totalPrice(menuList.get(3).getPrice());
                    break;

                case "0" :
                    System.out.println("프로그램을 종료합니다.");
                    break;

                default :
                    System.out.println("잘못입력");
            }

            printSelectedMenu(menuName);

            if("0".equals(inputNum)){
                System.out.println("프로그램을 종료합니다.");
                break;
            }
        }
    }

    private void printSelectedMenu(List<String> menuName){
        System.out.println("선택한 메뉴 목록");//골랐던 메뉴 이름 출력 반복문
        for (String menu : menuName) {
            System.out.println(menu);
        }
        System.out.println("가격 : " + MenuItem.getTotalPrice()); //골랐던 메뉴 총합 가격
    }

}


2025-01-14

Level4

package level4;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Kiosk {
    private Scanner sc = new Scanner(System.in);
    private List<Menu> categories;
    private List<MenuItem> menuList;

    public Kiosk(List<Menu> categories) {
        this.categories = categories;
    }

    public void start(){    //시작하면서 메뉴 목록이랑 사용자가 입력해야할 키 알려주는 메서드
        System.out.println("카테고리 선택 (숫자 입력)");

        for (int i = 0; i < categories.size(); i++) {
            System.out.println((i + 1) + ". " + categories.get(i).getCategory());
        }

        String inputCategory = sc.nextLine();
        compareCategory(inputCategory); //고른 카테고리 판별 메서드 호출
    }

    private void compareInput(){    //사용자가 입력한 번호에 해당하는 메뉴 찾고 저장하는 메서드
        List<String> menuName = new ArrayList<>();  //고른 메뉴 이름 저장용

        while (true){
            String inputNum = sc.nextLine();    //사용자한테 입력받는 메뉴 번호

            switch (inputNum){
                case "1" :
                    menuName.add(menuList.get(0).getFoodName());    //고른 메뉴 이름 저장
                    MenuItem.totalPrice(menuList.get(0).getPrice());    //고른 메뉴 가격 저장
                    break;
                case "2" :
                    menuName.add(menuList.get(1).getFoodName());
                    MenuItem.totalPrice(menuList.get(1).getPrice());
                    break;

                case "3" :
                    menuName.add(menuList.get(2).getFoodName());
                    MenuItem.totalPrice(menuList.get(2).getPrice());
                    break;

                case "4" :
                    menuName.add(menuList.get(3).getFoodName());
                    MenuItem.totalPrice(menuList.get(3).getPrice());
                    break;

                case "0" :
                    System.out.println("프로그램을 종료합니다.");
                    break;

                default :
                    System.out.println("잘못입력했습니다. 다시 입력해주세요 (0: 종료, 1 ~ 4 : 메뉴선택");
                    break;
            }

            printSelectedMenu(menuName);    //선택한 메뉴 목록, 가격 출력 메서드 호출

            if(!exitProgram(inputNum)){   //프로그램 종료 메서드 호출
                break;
            }
        }
    }

    private void printSelectedMenu(List<String> menuName){  //고른 메뉴 이름, 가격 알려주는 메서드
        System.out.println("선택한 메뉴 목록");

        for (String menu : menuName) {
            System.out.println(menu);
        }

        System.out.println("가격 : " + MenuItem.getTotalPrice());
    }

    private boolean exitProgram(String inputNum){    //프로그램 종료 메서드
        return !"0".equals(inputNum);
    }

    private void compareCategory(String category){ // 고른 카테고리에 따라 분기점
        if("1".equals(category)){
            menuList = categories.get(0).getMenuItems();
            selectMenu(category);
            compareInput(); //사용자가 입력한 번호에 해당하는 메뉴 찾고 저장하는 메서드 호출
        } else if("2".equals(category)){
            menuList = categories.get(1).getMenuItems();
            selectMenu(category);
            compareInput();
        } else {
            System.out.println("잘못 입력하셨습니다. 다시입력해주세요");
            start();    //다시 시작부터
        }
    }

    private void selectMenu(String category){    //메뉴 출력
        if("1".equals(category))
            System.out.println("[ SHAKESHACK MENU ]");
		else if ("2". equals(category))
            System.out.println("[ DRINK MENU ]");
            
        for (int i = 0; i < menuList.size(); i++) {
            System.out.println((i + 1) + ". " + menuList.get(i));
        }

        System.out.println("0. 종료 | 종료");
        System.out.print("메뉴를 선택해주세요. (0 : 종료, 1 ~ 4 : 메뉴선택) : ");
    }

//    private void selectDrink(){ //카테고리 음료의 메뉴 목록
//        System.out.println("[ DRINK MENU ]");
//
//        for (int i = 0; i < menuList.size(); i++) {
//            System.out.println((i + 1) + ". " + menuList.get(i));
//        }
//
//        System.out.println("0. 종료 | 종료");
//        System.out.print("메뉴를 선택해주세요. (0 : 종료, 1 ~ 2 : 메뉴선택) : ");
//    }

//    private void selectBerger(){ //카테고리 버거의 메뉴 목록
//        System.out.println("[ SHAKESHACK MENU ]");
//
//        for (int i = 0; i < menuList.size(); i++) {
//            System.out.println((i + 1) + ". " + menuList.get(i));
//        }
//
//        System.out.println("0. 종료 | 종료");
//        System.out.print("메뉴를 선택해주세요. (0 : 종료, 1 ~ 2 : 메뉴선택) : ");
//    }
}

키오스크 클래스를 작성하던 중에 카테고리를 고르면 그 카테고리에 해당하는 메뉴가 나오게 코드를 작성 중 이었다.

 

 selectBerger랑 selectDrink가 코드가 너무 유사하다. 하나의 코드로 합치고 싶어져서 selectMenu 메소드를 생성했다.

카테고리 선택에 따른 메뉴가 잘 나오는 모습이다.

 

 

 

다른 문제 발생

package level4;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Kiosk {
    private Scanner sc = new Scanner(System.in);
    private List<Menu> categories;
    private List<MenuItem> menuList;

    public Kiosk(List<Menu> categories) {
        this.categories = categories;
    }

    public void start(){    //시작하면서 메뉴 목록이랑 사용자가 입력해야할 키 알려주는 메서드
        System.out.println("카테고리 선택");

        for (int i = 0; i < categories.size(); i++) {
            System.out.println((i + 1) + ". " + categories.get(i).getCategory());
        }

        String inputCategory = sc.nextLine();
        compareCategory(inputCategory); //고른 카테고리 판별 메서드 호출
    }

    private void compareInput(){    //사용자가 입력한 번호에 해당하는 메뉴 찾고 저장하는 메서드
        List<String> menuName = new ArrayList<>();  //고른 메뉴 이름 저장용

        while (true){
            String inputNum = sc.nextLine();    //사용자한테 입력받는 메뉴 번호

            switch (inputNum){
                case "1" :
                    menuName.add(menuList.get(0).getFoodName());    //고른 메뉴 이름 저장
                    MenuItem.totalPrice(menuList.get(0).getPrice());    //고른 메뉴 가격 저장
                    break;
                case "2" :
                    menuName.add(menuList.get(1).getFoodName());
                    MenuItem.totalPrice(menuList.get(1).getPrice());
                    break;

                case "3" :
                    menuName.add(menuList.get(2).getFoodName());
                    MenuItem.totalPrice(menuList.get(2).getPrice());
                    break;

                case "4" :
                    menuName.add(menuList.get(3).getFoodName());
                    MenuItem.totalPrice(menuList.get(3).getPrice());
                    break;

                case "0" :
                    System.out.println("프로그램 종료");
                    break;

                default :
                    System.out.println("잘못입력했습니다. 다시 입력해주세요 (0: 종료, 1 ~ 4 : 메뉴선택");
                    break;
            }

            printSelectedMenu(menuName);    //선택한 메뉴 목록, 가격 출력 메서드 호출

            if(exitProgram(inputNum)){   //프로그램 종료 메서드 호출
                break;
            }
        }
    }

    private void printSelectedMenu(List<String> menuName){  //고른 메뉴 이름, 가격 알려주는 메서드
        System.out.println("선택한 메뉴 목록");

        for (String menu : menuName) {
            System.out.println(menu);
        }

        System.out.println("가격 : " + MenuItem.getTotalPrice() + "원");
    }

    private boolean exitProgram(String inputNum){    //프로그램 종료 메서드
        return "0".equals(inputNum);
    }

    private void compareCategory(String category){ // 고른 카테고리에 따라 분기점
        if("1".equals(category)){
            menuList = categories.get(0).getMenuItems();    //1번이니까 햄버거 저장
            selectMenu(category);   //메뉴 출력 메서드 호출
            compareInput(); //사용자가 입력한 번호에 해당하는 메뉴 찾고 저장하는 메서드 호출
        } else if("2".equals(category)){
            menuList = categories.get(1).getMenuItems();    //2번이니까 음료수 저장
            selectMenu(category);
            compareInput();
        } else {
            System.out.println("잘못 입력하셨습니다. 다시입력해주세요");
            start();    //다시 시작부터
        }
    }

    private void selectMenu(String category){    //메뉴 출력
        if("1".equals(category))
            System.out.println("[ SHAKESHACK MENU ]");
        else if ("2". equals(category))
            System.out.println("[ DRINK MENU ]");

        for (int i = 0; i < menuList.size(); i++) {
            System.out.println((i + 1) + ". " + menuList.get(i));
        }

        System.out.println("0. 종료 | 종료");
        System.out.print("메뉴를 선택해주세요. (0 : 종료, 1 ~ 4 : 메뉴선택) : ");
    }
}

 

레벨4의 출력 결과를 보니 과제 이해를 잘못했다는걸 깨달았다.

키오스크에서 메뉴를 선택하면 선택한 메뉴들의 메뉴 이름과 가격 총합을 출력하는 형식이 내 코드이다.

그러나 과제에서 요구하는 내용은 키오스크의 메뉴를 출력하는 것이다.

그리고 메뉴에서 카테고리로 돌아갈 수 있는 기능과 카테고리에서 종료를 할 수 있게 짜야했다.

하지만 나는 메뉴에서 선택을 하다가 종료하는 코드였기 때문에 이것 또한 실수 였던 것이다.

이미 만들어 놓은 기능이 아까우니 지우진 말고 아래와 같은 문제를 해결해야 한다.

 

  1. 메뉴에서 카테고리로 돌아가는 코드 짜야함
  2. 카테고리에서 종료하는 코드 짜야함

 

1번 해결과정

1. while(true)로 start() 메서드 내용을 감싼다.

2. 프로그램 종료 메서드를 넣어서 0일 경우 종료하게 한다.

 

public void start(){    //시작하면서 메뉴 목록이랑 사용자가 입력해야할 키 알려주는 메서드
        while (true){
            System.out.println("카테고리 선택 (종료 : 0)");

            for (int i = 0; i < categories.size(); i++) {
                System.out.println((i + 1) + ". " + categories.get(i).getCategory());
            }

            String inputCategory = sc.nextLine();

            if(exitProgram(inputCategory)){   //프로그램 종료 메서드 호출
                break;
            }

            compareCategory(inputCategory); //고른 카테고리 판별 메서드 호출
        }
    }

 

 

2번 해결과정

1. compareInput 메서드의 switch 문 안에 카테고리 선택으로 돌아가는 경우를 case에 추가

 private void compareInput(){    //사용자가 입력한 번호에 해당하는 메뉴 찾고 저장하는 메서드
        List<String> menuName = new ArrayList<>();  //고른 메뉴 이름 저장용

        while (true){
            String inputNum = sc.nextLine();    //사용자한테 입력받는 메뉴 번호

            switch (inputNum){
                case "1" :
                    menuName.add(menuList.get(0).getFoodName());    //고른 메뉴 이름 저장
                    MenuItem.totalPrice(menuList.get(0).getPrice());    //고른 메뉴 가격 저장
                    break;
                case "2" :
                    menuName.add(menuList.get(1).getFoodName());
                    MenuItem.totalPrice(menuList.get(1).getPrice());
                    break;

                case "3" :
                    menuName.add(menuList.get(2).getFoodName());
                    MenuItem.totalPrice(menuList.get(2).getPrice());
                    break;

                case "4" :
                    menuName.add(menuList.get(3).getFoodName());
                    MenuItem.totalPrice(menuList.get(3).getPrice());
                    break;

                case "000" :
                    System.out.println("뒤로");
                    return;

                case "0" :
                    System.out.println("프로그램 종료");
                    break;

                default :
                    System.out.println("잘못입력했습니다. 다시 입력해주세요 (0: 종료, 1 ~ 4 : 메뉴선택, 000 : 뒤로");
                    break;
            }

000 입력시 돌아가게 작성했다.

 

 

 

 

다른문제 발생

package level4;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Kiosk {

    ...............................................
    
    public void start(){    //시작하면서 메뉴 목록이랑 사용자가 입력해야할 키 알려주는 메서드
        while (true){
            System.out.println("카테고리 선택 (종료 : 0)");

            System.out.println("0. 종료");
            for (int i = 0; i < categories.size(); i++) {
                System.out.println((i + 1) + ". " + categories.get(i).getCategory());
            }


            String inputCategory = sc.nextLine();

            compareCategory(inputCategory); //고른 카테고리 판별 메서드 호출

            if(exitProgram(inputCategory)){   //프로그램 종료 메서드 호출
                break;
            }
        }
    }
    
    private void compareInput(){    //사용자가 입력한 번호에 해당하는 메뉴 찾고 저장하는 메서드
        List<String> menuName = new ArrayList<>();  //고른 메뉴 이름 저장용

        while (true){
            String inputNum = sc.nextLine();    //사용자한테 입력받는 메뉴 번호

            switch (inputNum){
                case "1" :
                    menuName.add(menuList.get(0).getFoodName());    //고른 메뉴 이름 저장
                    MenuItem.totalPrice(menuList.get(0).getPrice());    //고른 메뉴 가격 저장
                    break;
                case "2" :
                    menuName.add(menuList.get(1).getFoodName());
                    MenuItem.totalPrice(menuList.get(1).getPrice());
                    break;

                case "3" :
                    menuName.add(menuList.get(2).getFoodName());
                    MenuItem.totalPrice(menuList.get(2).getPrice());
                    break;

                case "4" :
                    menuName.add(menuList.get(3).getFoodName());
                    MenuItem.totalPrice(menuList.get(3).getPrice());
                    break;

                case "000" :
                    System.out.println("뒤로");
                    return;

                case "0" :
                    System.out.println("프로그램 종료");
                    break;

                default :
                    System.out.println("잘못입력했습니다. 다시 입력해주세요 (0: 종료, 1 ~ 4 : 메뉴선택, 000 : 뒤로");
                    break;
            }

            printSelectedMenu(menuName);    //선택한 메뉴 목록, 가격 출력 메서드 호출

            if(exitProgram(inputNum)){   //프로그램 종료 메서드 호출
                break;
            }
        }
    }

 ..........................................
 
 private void compareCategory(String category){ // 고른 카테고리에 따라 분기점
        if("1".equals(category)){
            menuList = categories.get(0).getMenuItems();    //1번이니까 햄버거 저장
            selectMenu(category);   //메뉴 출력 메서드 호출
            compareInput(); //사용자가 입력한 번호에 해당하는 메뉴 찾고 저장하는 메서드 호출
        } else if("2".equals(category)){
            menuList = categories.get(1).getMenuItems();    //2번이니까 음료수 저장
            selectMenu(category);
            compareInput();
        } else {
            System.out.println("잘못 입력하셨습니다. 다시입력해주세요");
            start();    //다시 시작부터
        }
    }
 
}

  1. 버거 고르고 음료로 돌아가서 음료를 고르니 선택한 메뉴 목록에 버거의 이름이 안나옴.
  2. 메뉴선택을 마치고 0번 입력시 종료해야되는데 카테고리로 돌아가서 또 0을 입력해야 종료됨.

 

 

1번 문제 해결방법

 

원인

List<String> menuName = new ArrayList<>(); 문장이 compareInput() 메서드 안에 지역변수로 선언되어 있어서 그랬다.

000을 입력해 compareInput() 메서드의 실행 종료 후 카테고리로 선택으로 돌아갈때 menuName이 생존하지 못해 메뉴의 이름이 다 날아간 것이었다.

 

해결

전역 변수로 선언해주어 해결했다.

public class Kiosk {
    private Scanner sc = new Scanner(System.in);
    private List<Menu> categories;
    private List<MenuItem> menuList;
    private List<String> menuName = new ArrayList<>();  //고른 메뉴 이름 저장용

..................

 

 

 

2번 문제 해결 방법

 

원인

0을 입력후 compareInput 메서드가 끝난뒤 start메서드에서 compareInput 메서드가 호출이 된 시점으로 돌아간다.

그럼 start 메서드의 반복을 멈춰주는 메서드를 만나게 되는데 그때 조건이 맞지않아 start 메서드가 다시 반복하게 된다.

 

해결

compareCatergory 메서드의 반환값을 boolean으로 변경해준다.

그리고 메서드 내부에 String exit = compareInput(); 문장을 추가한다.

메서드를 호출함과 동시에 반환값을 String 타입에 대입하게 된다.

대입한 값을 return exitProgram(exit) 문장을 추가하여 boolean 값을 반환한다.

그리고 start 메서드에서 if문을 추가한다.

if 문 안에 compareCategroy 메서드를 넣어 호출과 동시에 조건 여부에 따라 break; 문을 만나 반복을 멈추게 한다.

 

private boolean compareCategory(String category){ // 고른 카테고리에 따라 분기점
        if("1".equals(category)){
            menuList = categories.get(0).getMenuItems();    //1번이니까 햄버거 저장
            selectMenu(category);   //메뉴 출력 메서드 호출
        } else if("2".equals(category)){
            menuList = categories.get(1).getMenuItems();    //2번이니까 음료수 저장
            selectMenu(category);
        } else {
            System.out.println("잘못 입력하셨습니다. 다시입력해주세요");
            start();    //다시 시작부터
        }

        String exit = compareInput();
        return exitProgram(exit);
    }
    
    ....................................................................
    
public void start(){    //시작하면서 메뉴 목록이랑 사용자가 입력해야할 키 알려주는 메서드
        while (true){
            System.out.println("카테고리 선택 (종료 : 0)");

            System.out.println("0. 종료");
            for (int i = 0; i < categories.size(); i++) {
                System.out.println((i + 1) + ". " + categories.get(i).getCategory());
            }


            String inputCategory = sc.nextLine();

            if(exitProgram(inputCategory)){   //프로그램 종료 메서드 호출
                break;
            }

            if(compareCategory(inputCategory)) { //고른 카테고리 판별 및 반환값에 따라 프로그램 종료
                break;
            }
        }
    }


2025-01-16

level6

package level6;

import level4.MenuItem;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Kiosk {
    private Scanner sc = new Scanner(System.in);
    private List<Menu> categories;
    private List<level4.MenuItem> menuList;
    private List<String> menuName = new ArrayList<>();  //고른 메뉴 이름 저장용

    public Kiosk(List<Menu> categories) {
        this.categories = categories;
    }

    public void start(){    //시작하면서 메뉴 목록이랑 사용자가 입력해야할 키 알려주는 메서드
        while (true){
            System.out.println("카테고리 선택 (종료 : 0)");

            System.out.println("0. 종료");
            for (int i = 0; i < categories.size(); i++) {
                System.out.println((i + 1) + ". " + categories.get(i).getCategory());
            }


            String inputCategory = sc.nextLine();

            if(exitProgram(inputCategory)){   //프로그램 종료 메서드 호출
                break;
            }

            if(compareCategory(inputCategory)) { //고른 카테고리 판별 및 반환값에 따라 프로그램 종료
                break;
            }
        }
    }

    private String compareInput(){    //사용자가 입력한 번호에 해당하는 메뉴 찾고 저장하는 메서드
        String input = "";

        while (true){
            String inputNum = sc.nextLine();    //사용자한테 입력받는 메뉴 번호

            if ("0".equals(inputNum)) {
                System.out.println("프로그램 종료");
                return "0"; // 종료를 위해 0 반환
            }

            switch (inputNum){
                case "1" :
                    input = inputReturn(inputNum);
                    addMenu(input, inputNum);
                    break;
                case "2" :
                    input = inputReturn(inputNum);
                    addMenu(input, inputNum);
                    break;

                case "3" :
                    input = inputReturn(inputNum);
                    addMenu(input, inputNum);
                    break;

                case "4" :
                    input = inputReturn(inputNum);
                    addMenu(input, inputNum);
                    break;

                case "000" :
                    System.out.println("뒤로");
                    return inputNum;

                default :
                    System.out.println("잘못입력했습니다. 다시 입력해주세요 (0: 종료, 1 ~ 4 : 메뉴선택, 000 : 뒤로");
                    break;
            }

            if(menuName != null)
                printSelectedMenu(menuName);    //선택한 메뉴 목록, 가격 출력 메서드 호출

            input = inputNum;

            if(exitProgram(inputNum)){   //프로그램 종료 메서드 호출
                break;
            }

        }
        return input;
    }

    private void printSelectedMenu(List<String> menuName){  //고른 메뉴 이름, 가격 알려주는 메서드
        System.out.println("선택한 메뉴 목록");

        for (String menu : menuName) {
            System.out.println(menu);
        }

        System.out.println("가격 : " + MenuItem.getTotalPrice() + "원");
    }

    private boolean exitProgram(String inputNum){    //프로그램 종료 메서드
        return "0".equals(inputNum);
    }

    private boolean compareCategory(String category){ // 고른 카테고리에 따라 분기점
        if("1".equals(category)){
            menuList = categories.get(0).getMenuItems();    //1번이니까 햄버거 저장
            selectMenu(category);   //메뉴 출력 메서드 호출
        } else if("2".equals(category)){
            menuList = categories.get(1).getMenuItems();    //2번이니까 음료수 저장
            selectMenu(category);
        } else {
            System.out.println("잘못 입력하셨습니다. 다시입력해주세요");
            start();    //다시 시작부터
        }

        String exit = compareInput();   //메뉴 고르는 메서드 호출하면서 반환값 받기
        return exitProgram(exit);
    }

    private void selectMenu(String category){    //메뉴 출력
        if("1".equals(category))
            System.out.println("[ SHAKESHACK MENU ]");
        else if ("2". equals(category))
            System.out.println("[ DRINK MENU ]");

        for (int i = 0; i < menuList.size(); i++) {
            System.out.println((i + 1) + ". " + menuList.get(i));
        }

        System.out.println("0. 종료 | 종료");
        System.out.print("메뉴를 선택해주세요. (0 : 종료, 1 ~ 4 : 메뉴선택, 000 : 돌아가기) : ");
    }

    private String inputReturn(String input) {  //compareInput에서 장바구니에 추가할지 여부 확인
        System.out.println(menuList.get(Integer.parseInt(input) - 1) +"\n위 메뉴를 장바구니에 추가하시겠습니까? \n1. 확인         2.취소");
        return sc.nextLine();
    }

    private void addMenu(String input, String inputNum){ //compareInput에서 장바구니 추가 메서드
        int index = Integer.parseInt(inputNum) - 1;
        if("1".equals(input)){
            menuName.add(menuList.get(index).getFoodName());    //고른 메뉴 이름 저장
            level4.MenuItem.totalPrice(menuList.get(index).getPrice());    //고른 메뉴 가격 저장
            System.out.println(menuList.get(index).getFoodName() + " 가 장바구니에 추가되었습니다.");
        } else if ("2".equals(input)) {
            System.out.println("이전");
        }
    }
}

처음에 addMenu를 추가했을때는 실수로 사용자의 메뉴 선택 번호를 안받아왔다.

그래서 메뉴가 무조건 쉐이크 버거만 추가됐었다. 메서드에 String inputNum을 매개변수로 추가하여 받아오고 그걸 index 지역변수에 저장한뒤 추가하는 방식으로 해결했다.