TIL

TIL - 2025/01/17

호롤로 2025. 1. 17. 20:47

▶ 진행사항

- 오늘은 개인과제 '키오스크 만들기' LV4 ~ LV5를 진행 및 최종 검토를 진행하였다.

 

▶ 키오스크 만들기 LV4 ~ 5

- 객체 지향 설계를 적용해 음식 메뉴와 주문 내역을 클래스 기반으로 관리 및 캡슐화 진행하기

 

▷ Kiosk 클래스

public class Kiosk {

    // 객체 생성 및 메뉴 목록 초기화
    private List<Menu> menus;

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

    // Getter
    public List<Menu> getMenu() {
        return menus;
    }

    // SettER
    public void setMenu(List<Menu> menus) {
        this.menus = menus;
    }

    // 키오스크 프로그램 시작
    public void start() {
        Scanner sc = new Scanner(System.in);

        // 반복문 while 을 이용한 리스트에 메뉴를 차례대로 출력 (앞에 번호 부여 및 출력시 상품명, 가격, 제품설명 출력)
        while (true) {
            System.out.println("[ MAIN MENU ]");
            for (int i = 0; i < menus.size(); i++) {
                System.out.printf("%d. %s\n", i + 1, menus.get(i).getCategory());
            }
            System.out.println("0. 종료       | 종료");

            System.out.print("메뉴를 선택하세요: ");
            String input = sc.nextLine();

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

            // 메뉴 선택 처리
            try {
                int choice = Integer.parseInt(input); // 입력 값을 정수로 변환
                if (choice > 0 && choice <= menus.size()) {
                    // 선택한 메뉴 출력
                    Menu selectedMenu = menus.get(choice - 1);
                    menuSelection(sc, selectedMenu);
                } else { // 메뉴 번호가 범위를 벗어난 경우
                    System.out.println("유효하지 않은 선택입니다. 다시 입력해주세요.");
                }
            } catch (NumberFormatException e) { // 입력값이 숫자가 아닌 경우
                System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.");
            }
        }
        sc.close();
    }

    // 입력받은 값의 메뉴항목 처리
    private void menuSelection(Scanner sc, Menu selectedMenu) {
        while (true) {
            selectedMenu.displayMenuItems();

            System.out.print("메뉴를 선택하세요: ");
            String input = sc.nextLine();

            // 0을 입력시 다시 초기 화면으로 돌아감
            if (input.equals("0")) {
                System.out.println("메인 메뉴로 돌아갑니다.");
                break;
            }

            // 입력 처리
            try {
                int choice = Integer.parseInt(input); // 입력 값을 정수로 변환
                List<MenuItem> items = selectedMenu.getMenuItems();
                if (choice > 0 && choice <= items.size()) { // 입력한 값이 유효한 범위 내에 있는지 확인하고
                    MenuItem selectedItem = items.get(choice - 1); // 값이 맞다면 해당 번호에 맞는 메뉴를 출력 (items 리스트에서 -1 번째 항목을 가져옴 - 인덱스 0 데이터)
                    System.out.printf("선택한 메뉴: %s | W %.1f | %s\n", selectedItem.getName(), selectedItem.getPrice(), selectedItem.getProductInfo());
                return; // 해당 메서드 종료
                } else { // 메뉴 번호가 범위를 벗어난 경우
                    System.out.println("유효하지 않은 선택입니다. 다시 입력해주세요.");
                }
            } catch (NumberFormatException e) { // 입력값이 숫자가 아닌 경우
                System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.");
            }
        }
    }
}

 

▷ Menu 클래스

public class Menu {
    private String category;
    private final List menuItems;

    public Menu(String category) {
        this.category = category;
        this.menuItems = new ArrayList();
    }

    // Getter
    public String getCategory() {
        return category;
    }

    public List<MenuItem> getMenuItems() {
        return menuItems;
    }

    // Setter
    public void setCategory(String category) {
        this.category = category;
    }

    // 메뉴 항목 추가
    public void addMenuItem(MenuItem item) {
        menuItems.add(item);
    }

    // 메뉴 항목 출력
    public void displayMenuItems() {
        System.out.printf("[ %s MENU ]\n", category); // 선택별로 ~~ 메뉴인지 표시
        for (int i = 0; i < menuItems.size(); i++) { // 번호 부여
            MenuItem item = (MenuItem) menuItems.get(i);
            // 번호, 음식이름, 가격, 상품정보 차례대로 출력
            System.out.printf("%d. %-15s | W %.1f | %s\n", i + 1, item.getName(), item.getPrice(), item.getProductInfo());
        }
        System.out.println("0. 뒤로가기");
    }
}

 

▷ MenuItem 클래스

public class MenuItem {
    private String name;
    private double price;
    private String productInfo;

    public MenuItem(String name, double price, String productInfo) {
        this.name = name;
        this.price = price;
        this.productInfo = productInfo;
    }

    // Getter
    public String getName() {
        return name;
    }

    public double getPrice() {
        return price;
    }

    public String getProductInfo() {
        return productInfo;
    }

    // Setter
    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void setProductInfo(String productInfo) {
        this.productInfo = productInfo;
    }
}

 

▷ Main 클래스

public class Main {
    public static void main(String[] args) {

        // 메뉴별로 초기화 진행
        Menu burgers = new Menu("Burgers"); // 버거 메뉴 초기화
        burgers.addMenuItem(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
        burgers.addMenuItem(new MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑솟브가 토핑된 치즈버거"));
        burgers.addMenuItem(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
        burgers.addMenuItem(new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));

        Menu drinks = new Menu("Drinks"); // 쥬스 메뉴 초기화
        drinks.addMenuItem(new MenuItem("Coke", 2.0, "시원한 코카콜라"));
        drinks.addMenuItem(new MenuItem("Sprite", 2.0, "상쾌한 스프라이트"));
        drinks.addMenuItem(new MenuItem("Water", 1.5, "깨끗한 생수"));

        Menu desserts = new Menu("Desserts"); // 디저트 메뉴 초기화
        desserts.addMenuItem(new MenuItem("Ice Cream", 3.5, "바닐라 이이스크림"));
        desserts.addMenuItem(new MenuItem("Brownie", 4.0, "진한 초콜릿 브라우니"));

        // 전체 메뉴로 묶음
        List<Menu> allMenu = new ArrayList<>();
        allMenu.add(burgers);
        allMenu.add(drinks);
        allMenu.add(desserts);

        // 키오스크 객체 생성 및 실행 , 프로그램 시작
        Kiosk kiosk = new Kiosk(allMenu);
        kiosk.start();
    }
}

 

▶ 트러블슈팅

▷문제점 발생

 - LV4~5 진행 中, 클래스 호출에서 문제가 발생하여, 클래스가 제대로 호출되지 않는 문제가 발생했다.

 (해당 클래스의 정보가 제대로 연동되지 못하고 계속 없는 해당 클래스를 생성하라는 오류 메세지가 뜸)

 

▷ 이유 분석

- 분명히 해당 클래스 및 필요한 메서드가 정의되어 있는지 확인

 □ Getter, Setter 설정 중 실수는 없엇는가? O

 □ 단순한 타이핑 실수는 아닌가? X 

 □ 객체 생성에 문제는 없는가? O (문제 발견)

 └ private List menus;(문제점) → private List<Menu> menus;(해결) - 선언이 잘못되었네...?

※ Java 문법 종합반 3주차 제 정독 中 문제점 발견...

 

▷ 해결

- 장장 하루를 넘게 코드를 처음부터 뜯어 읽어보며 문제가 된 부분을 몇번씩이나 지나쳣지만, 문제점을 인지 못하고 지나쳤다는게 정말 황당한 경험이다. 자바에 기초인 객체 생성에서 단순한 실수로 잡아먹은 시간이 어이가 없을 지경이다. 이게 다 부족한 기본 지식에서 나오는 단순한 실수지 않을까.. 멍청하면 몸이 고생한다는 말이 딱 들어맞았다.... 허무해

 

▶ 마치며

- 이번 프로젝트를 진행하며, 자신의 기초가 얼마나 부족한지 여실히 깨닫는 시간이 되었다. 전주에 이미 계산기 만들기 과제를 하며 충분히 기본을 쌓아둿다 생각했으나, 다시금 새로운 프로젝트를 시작하니, 시작점부터 막히는 자신을 볼수 있었다...(계산기 과제야 고마워... 다 너 배낀거같아) 다음 프로젝트 이전까지 시간이 남는다면 자바에 기초를 더욱 다듬을수 있는 시간을 가져보려한다.

 

 

'TIL' 카테고리의 다른 글

TIL 2025/02/12  (0) 2025.02.13
TIL - 2025/02/03  (0) 2025.02.03
TIL 2024/01/09  (0) 2025.01.10
TIL 2025/01/08  (0) 2025.01.08
TIL - 2025/01/03  (1) 2025.01.03