내배캠 TIL 15일차

오병택·2025년 3월 10일

내배캠

목록 보기
37/73

학습 요약

키오스크 lv4~5 완료, 도전 lv1 거의 다 해가는 중, 코드 리뷰

키오스크 lv4~5

Kiosk 클래스

package com.example.kiosk;

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

public class Kiosk {
    private Menu menu = new Menu();
    private final List<Menu> listMenus = new ArrayList<>();
    private final Scanner sc = new Scanner(System.in);
    private boolean flag = true;

    public void start() {
        listMenus.add(new Menu("Burgers"));
        listMenus.add(new Menu("Drinks"));
        listMenus.add(new Menu("Desserts"));
        while (flag) {
            System.out.println();
            System.out.println("[ MAIN MENU" + " ]");
            for (int i = 0; i< listMenus.size(); i++) {
                System.out.println(i+1+"." + " " +listMenus.get(i).getCategory());
            }
            System.out.println("0. 종료      | 종료");
            System.out.println();
            System.out.print("메뉴를 선택해주세요 : ");
            int chooseParentMenu;
            try {
                chooseParentMenu = sc.nextInt();
            } catch (InputMismatchException e) {
                System.out.println("올바르지 않은 입력입니다");
                sc.nextLine();
                continue;
            }
            if (chooseParentMenu ==0 ) {
                System.out.println("프로그램을 종료합니다");
                flag = false;
            }else if (chooseParentMenu > 0 && chooseParentMenu < 4) {
                menu = listMenus.get(chooseParentMenu-1);
                System.out.println("선택한 메인메뉴 :  " + chooseParentMenu + ". "+ menu.getCategory());
            }else {
                System.out.println("메뉴에 있는 숫자만 써주세요");
                continue;
            }

            if (chooseParentMenu==0) {
                break;
            }
            while (true) {
                System.out.println();
                System.out.println("[ " + menu.getCategory() + "MENU" + " ]");
                menu.showMenuCategory();
                System.out.println("0. 되돌아가기      | 되돌아가기");
                System.out.println();
                System.out.print("메뉴를 선택해주세요 : ");
                int chooseChildMenu;
                try {
                    chooseChildMenu = sc.nextInt();
                }catch (InputMismatchException e) {
                    System.out.println("올바르지 않은 입력입니다");
                    sc.nextLine();
                    continue;
                }

                if (chooseChildMenu == 0) {
                    System.out.println("되돌아갑니다");
                } else if (chooseChildMenu > 0 && chooseChildMenu < 5) {
                    System.out.println("선택한 " + menu.getCategory() + "메뉴 :  " + chooseChildMenu + ". " + menu.getMenuItems().get(chooseChildMenu - 1).getName() + "  | W " + menu.getMenuItems().get(chooseChildMenu - 1).getPrice() + " | " + menu.getMenuItems().get(chooseChildMenu - 1).getExplanation());
                } else {
                    System.out.println("메뉴에 있는 숫자만 써주세요");
                    continue;
                }
                break;
            }
        }
    }
}
package com.example.kiosk;

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

public class Menu {
    private String category;
    private final List<MenuItem> menuItems = new ArrayList<>();

    public Menu() {

    }

    public Menu(String category) {
        this.category=category;
        switch (this.category) {
            case "Burgers" -> {
                menuItems.add(new MenuItem("ShackBurger ",6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
                menuItems.add(new MenuItem("SmokeShack  ",8.9, " 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
                menuItems.add(new MenuItem("Cheeseburger",6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
                menuItems.add(new MenuItem("Hamburger   ",5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
            }
            case "Drinks" -> {
                menuItems.add(new MenuItem("Water           ",1.0, "리얼 제로 칼로리 청정수"));
                menuItems.add(new MenuItem("Coke & zero Coke",2.0, "펩시 주문 안 받아요"));
                menuItems.add(new MenuItem("MilkShake       ",2.5, "신선한 우유가 들어간 부드러운 밀크셰이크"));
                menuItems.add(new MenuItem("Sprite          ",2.0, "목이 너무 따갑지만 청량감 원탑"));
            }
            case "Desserts" -> {
                menuItems.add(new MenuItem("CheeseCake     ",4.0, "내가 좋아해서 파는 메뉴"));
                menuItems.add(new MenuItem("CheeseStick    ",2.0, "치즈 2m 늘어남"));
                menuItems.add(new MenuItem("Ice Cream      ",2.0, "달달하이 쳐 쥑이네"));
                menuItems.add(new MenuItem("Chicken Nuggets",2.0, "단백질 부족하신 분 더 사드세요"));
            }
            default -> System.out.println("카테고리에 있는 것만 선택해주세요");
        }
    }

    public void showMenuCategory() {
        int i = menuItems.size()-1;
        for (MenuItem menuItem : menuItems) {
            System.out.println(menuItems.size()-i +". " + menuItem.getName() + "  | W " + menuItem.getPrice() + " | " + menuItem.getExplanation());
            i--;
        }
    }

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

    public String getCategory() {
        return this.category;
    }
}
package com.example.kiosk;

public class MenuItem {
    private final String name;
    private final double price;
    private final String explanation;

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

    public String getName() {
        return name;
    }
    public double getPrice() {
        return price;
    }
    public String getExplanation() {
        return explanation;
    }
}

main은 전과 같아서 따로 올리지 않았습니다. 그러고 보니 주석 처리를 너무 안 해서 코드 보기 어려웠을 수도 있겠다는 생각이 갑자기 들어서 주석 처리를 습관을 들이는 게 좋을 것 같다. 확실히 조금씩 빨라지는 느낌이 들고 익숙해지고 있다는 느낌이 든다.

코드 리뷰

팀원분들이 말씀해주신 개선사항✔

  • else if 쓰지 말고 else문으로 하고 예외처리로 해주기
    이유: 코드 변경 시 수정해야 함
  • while문의 flag를 true로 바꿔주는 게 나을 것 같다.
    이유: 제어할 만한 구간이 거의 없기 때문.
  • flag와 menu 지역변수로 처리하기
    이유: 메모리 아낄 수 있음.
  • try-catch 중복되는 부분 메서드로 빼서 중복 제거 해주기
  • toString 오버라이딩.. 이건 진짜 최우선적으로 해봐야 겠다. 이것만 잘 안 고쳐지네
    이유: 가독성이 좋아짐

느낀 점

점 점 재밌어지는 것 같다. 약간 어려운 수학 문제나 헬스 같은.. 어려운 부분을 해치우고 난 뒤 오는 쾌감? 그럼 느낌. 아직 어려운 부분인 enum은 시작도 안 했지만 빨리 한 덕에 enum 부분에 시간을 많이 쏟을 수 있어서 조금 여유롭다. 빨리 다 하고 시간 남으면 복습도 좀 해야 겠다.

profile
걱정하지 말고 일단 해봐!

0개의 댓글