본 캠프_16일차

졸용·2025년 3월 11일

TIL

목록 보기
17/144

⭐ 두 번째 개인 프로젝트 - 키오스크

⭐ To do List

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;
    }

⭐ 트러블 슈팅

⚠️ .length 와 .length() 의 차이점

// 사용자에게 카테고리 번호를 입력받는 메서드
    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 문 안에 있던 메뉴 출력하는 로직을 삭제해서 해결

⚠️ return 없는 문제

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

➡️ break로 프로그램을 그냥 종료하는 대신, return -1; 적용해서 프로그램 종료 시 choice 값을 반환하도록 수정. while 문의 종료 시에도 똑같이 적용해서 수정해서 해결

⚠️ 0 번 입력 시 프로그램 종료 문제 발생

카테고리 번호를 입력받는 메서드에서

if (choice == 0) {
                    System.out.println("프로그램을 종료합니다.");
                    return -1;
                }

➡️ return -1 부분을 `System.exit(0); 으로 수정해서 0번을 입력하면 프로그램을 완전히 종료시키는 방법으로 해결

profile
꾸준한 공부만이 답이다

0개의 댓글