[1/15] TIL - 키오스크 프로그램 구현, 엉덩이 아프다

2025. 1. 15. 22:53개발 회고/TIL

😊오늘 배운 내용

키오스크 과제 level 5 까지 구현, 싱글쓰레드, 멀티쓰레드, 우선순위, 데몬쓰레드, 쓰레드 상태, 쓰레드 그룹

 

[어떤 문제가 있었는지 + 어떻게 해결하였는지]

1. level3 -> level4

레벨 3 요구사항을 구현하고 level 4 요구사항을 구현하는데 처음에는 Menu 클래스를 만들어서 메뉴 카테고리들을 관리하고 MenuItem 클래스에서 각 메뉴들을 관리하는 구조가 이해가 가지 않았다. 

그래서 직접 종이에 적어보면서 각 클래스들이 어떠한 관계를 가지고 있는지 정리해보았다. 그랬더니 훨씬 이해도 가기 쉬웠고 각 클래스가 관리하는 필드에 무엇이 들어가있는지 파악할 수 있었다. 

 

따라서 이제 level5 까지 구현이 완료 되어서 다음과 같은 로직을 가지는 프로그램이 동작할 수 있게 되었다!

메뉴 카테고리 출력 -> 메뉴 카테고리 선택 -> 선택된 카테고리의 메뉴들 출력 -> 메뉴 선택 -> 메뉴선택을 반복하다가 0 입력시 뒤로가기 -> 다시 메뉴 카테고리 출력(0 입력시 종료)

 

다만 지금 한가지 아쉬운 점은 요구사항에 Menu 클래스에서 리스트에 들어있는 MenuItem 객체들을 조회할 수 있는 함수를 구현하라 했었는데 구현했지만 정작 Kiosk 클래스에서 사용하지 않고 있는 상황이다.

 

package org.example.level4;

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

public class Menu {
    //필드
    //MenuItem 클래스를 리스트로 관리
    private List<MenuItem> menuItems = new ArrayList<>();
    private String category;

    //생성자
    public Menu(String category, List<MenuItem> menuItems) {
        this.category = category;
        this.menuItems = menuItems;
    }

    //메서드
    //리스트에 들어있는 MenuItem을 순차적으로 보여주는 함수
    public void showMenuItem() {
        for (MenuItem a : menuItems) {
            System.out.println(a.toString());
        }
    }

    //메뉴리스트를 리턴하는 함수
    public List<MenuItem> getMenuItems() {
        return menuItems;
    }

    //카테고리를 리턴하는 함수
    public String getCategory() {
        return category;
    }
}

 

package org.example.level4;

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

public class Kiosk {
    //필드
    private List<Menu> menu = new ArrayList<>();

    //생성자
    public Kiosk(Menu ... menus) {
        for (Menu a : menus) {
            menu.add(a);
        }
    }

    //메서드
    public void start() {
        Scanner sc = new Scanner(System.in);
        while (true) {
            showCategory();
            int categoryChoice = sc.nextInt();
            if (categoryChoice == 0) {
                break;
            }

            //상세 메뉴 출력
            while (true) {
                int menuChoice;
                if (categoryChoice == 1) {
                    System.out.println("[BURGERS MENU]");
                    for (int i = 1; i < menu.get(0).getMenuItems().size(); i++) {

                        System.out.print(i + ". ");
                        System.out.printf("%-14s |",menu.get(0).getMenuItems().get(i).getName());
                        System.out.printf(" W %-3s | ",menu.get(0).getMenuItems().get(i).getPrice());
                        System.out.print(menu.get(0).getMenuItems().get(i).getDescription()+"\n");
                    }
                    System.out.println("0. 뒤로가기");

                    while(true) {
                        System.out.println("메뉴를 선택하세요: ");
                        menuChoice = sc.nextInt();

                        if (menuChoice == 0) {
                            break;
                        } else {
                            showSelectedMenu(1,menuChoice);
                        }
                    }
                    break;
                } else if (categoryChoice == 2) {
                    System.out.println("[BEVERAGES MENU]");
                    for (int i = 1; i < menu.get(1).getMenuItems().size(); i++) {
                        ;
                        System.out.print(i + ". ");
                        System.out.printf("%-14s |",menu.get(1).getMenuItems().get(i).getName());
                        System.out.printf(" W %-3s | ",menu.get(1).getMenuItems().get(i).getPrice());
                        System.out.print(menu.get(1).getMenuItems().get(i).getDescription()+"\n");
                    }
                    System.out.println("0. 뒤로가기");


                    while(true) {
                        System.out.println("메뉴를 선택하세요: ");
                        menuChoice = sc.nextInt();
                        if (menuChoice == 0) {
                            break;
                        } else {
                            showSelectedMenu(2,menuChoice);
                        }

                    }
                    break;

                } else if (categoryChoice == 3) {
                    System.out.println("[DESSERTS MENU]");
                    for (int i = 1; i < menu.get(2).getMenuItems().size(); i++) {

                        System.out.print(i + ". ");
                        System.out.printf("%-14s |",menu.get(2).getMenuItems().get(i).getName());
                        System.out.printf(" W %-3s | ",menu.get(2).getMenuItems().get(i).getPrice());
                        System.out.print(menu.get(2).getMenuItems().get(i).getDescription()+"\n");
                    }
                    System.out.println("0. 뒤로가기");

                    while (true) {
                        System.out.println("메뉴를 선택하세요: ");
                        menuChoice = sc.nextInt();
                        if (menuChoice == 0) {
                            break;
                        } else {
                            showSelectedMenu(3,menuChoice);
                        }
                    }
                    break;

                }
            }

        }
    }

    public void showCategory() {
        System.out.println("[MENU CATEGORY]");
        //for문 돌면서 카테고리 출력
        for (int i = 1; i <= menu.size(); i++) {
            System.out.println(i + ". " + menu.get(i-1).getCategory());
        }
        System.out.println("0. 종료      | 종료");
        System.out.println("메뉴 카테고리를 선택하세요 : ");
    }

    public void showSelectedMenu(int categoryChoice, int menuChoice) {
        System.out.print("선택된 메뉴 : ");
        System.out.printf("%-14s |",menu.get(categoryChoice-1).getMenuItems().get(menuChoice).getName());
        System.out.printf(" W %-3s | ",menu.get(categoryChoice-1).getMenuItems().get(menuChoice).getPrice());
        System.out.print(menu.get(categoryChoice-1).getMenuItems().get(menuChoice).getDescription()+"\n");
        System.out.println("");
    }


}



 

그래서 각 카테고리의 메뉴들을 출력할 때 상당히 코드 중복이 많이 되는 상황이다. 이걸 showMenuItem 함수에서 관리할 수 있도록 해서 코드중복을 줄일 예정이다. 

 

[오늘 회고]

오늘은 한동안 밖에 나가질 못해서 정말 정신이 나가버릴 것 같았다. 그래서 외출 2시간 해서 마트에 다녀왔다...^^ 그런데 외출 2시간 해서 2시간 더 늦게 끝나니 집중도 안되고 고역인것 같다... 오늘도 정신줄 간신히 붙들고 키오스크 과제만 겨우 해낸 것 같다. 

그래도 학교다닐 때는 나는 AI없으면 코드 한 줄 못짜는 바보같았는데 이제 점점 AI없이 나 혼자 뚝딱뚝딱 만드는 중이다. (그래도 이건 너무 기본적인 내용이라^^... 이 정돈 혼자하는 연습이 반드시 필요하다)

이번주 나의 목표는 키오스크 도전과제까지 완료하는 것이다. 도전과제 1은 장바구니 기능이라 5주차 강의를 안듣고 할 수 있을 것 같지만 2는 아마 강의를 들어야 할 수 있을 것 같다. 

내일은 꼭 5주차 강의를 다 듣고 도전과제 1까지 구현하는게 목표다. 

 

성장하는 과정은 과녁에 영점 조정하는 것과 같아서 오늘 실패하더라도 10점에 가깝게 목표를 다시 조정하면서 다시 해나가면 된다! 내일도 힘내보자