내배캠 TIL 19일차

오병택·2025년 3월 14일

내배캠

목록 보기
41/73

학습 요약

도전 lv2 키오스크

도전 lv2 키오스크

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 final Scanner sc;
    private final ShoppingCart shoppingCart;
    private final List<Menu> Menulist;
    private Menu menu;

    public Kiosk () {
        sc = new Scanner(System.in);
        shoppingCart = new ShoppingCart();
        Menulist = new ArrayList<>();
        Menulist.add(new Menu("Burgers"));
        Menulist.add(new Menu("Drinks"));
        Menulist.add(new Menu("Desserts"));
    }

    public void start() {
        while (true) {
            System.out.println();

            // 메인 메뉴 시작
            System.out.println("[ MAIN MENU" + " ]");
            for (int i = 0; i< Menulist.size(); i++) {
                System.out.println(i+1+"." + " " +Menulist.get(i).getCategory());
            }
            System.out.println("0. 종료      | 종료");
            System.out.println();
            int chooseParentMenu = io("메뉴를 선택해주세요 : ",0,3);
            if (chooseParentMenu == 0) {
                System.out.println("프로그램을 종료합니다");
                break;
            } else {
                menu = Menulist.get(chooseParentMenu - 1);
                System.out.println("선택한 메인메뉴 :  " + chooseParentMenu + ". " + menu.getCategory());
            }
            System.out.println();

            // 부 메뉴 시작
            System.out.println("[ " + menu.getCategory() + "MENU" + " ]");
            menu.showMenuCategory();
            System.out.println("0. 되돌아가기      | 되돌아가기");
            System.out.println();
            int chooseChildMenu = io("메뉴를 선택해주세요 : ",0,4);
            if (chooseChildMenu == 0) {
                System.out.println("되돌아갑니다");
                continue;
            } else {
                System.out.println("선택한 " + menu.getCategory() + "메뉴 :  " +
                        chooseChildMenu + ". " + menu.getMenuItems().get(chooseChildMenu - 1).toString());
                System.out.println();
                System.out.println();
                shoppingCartAddCancel(chooseChildMenu-1);
            }
            int s = shoppingCartOrderCancel();
            if (s==1) {break;}
        }
    }

    // 입출력 및 예외처리 메서드
    private int io(String choose, int min,int max) {
        while (true) {
            try {
                while (true) {
                    System.out.print(choose);
                    int input = sc.nextInt();
                    if (input>=min && input<=max) {
                        return input;
                    }else {
                        System.out.println("메뉴의 숫자에서만 골라주세요");
                    }
                }
            }catch (InputMismatchException e){
                System.out.println("숫자만 써주세요");
                sc.nextLine();
            }
        }
    }

    // 장바구니 추가 및 취소 기능 메서드
    private void shoppingCartAddCancel(int idx) {
        MenuItem menuItem = menu.getMenuItems().get(idx);
        List<MenuItem> shoppingCart1 = shoppingCart.getShoppingCartItems();

        System.out.println(menuItem.toString());
        System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
        System.out.println("1. 확인        2. 취소");
        int chooseShoppingCartMenu = io("번호를 선택해주세요 : ", 1, 2);
        if (chooseShoppingCartMenu == 1) {
            MenuItem shoppingCartItemTemp = new MenuItem(menuItem.getName(), menuItem.getPrice(),
                    menuItem.getExplanation(), 1);
            shoppingCart.addShoppingCartItems(shoppingCartItemTemp);

            // 장바구니에 같은 메뉴가 들어왔을 때 사용
            for (int i = 0; i<shoppingCart1.size()-1; i++) {
                for (int j = i+1; j<shoppingCart1.size(); j++) {
                    if (shoppingCart1.get(i).getName().equals(shoppingCart1.get(j).getName())) {
                        shoppingCart.removeShoppingCartItems(j);
                        shoppingCart1.get(i).setPrice();
                        shoppingCart1.get(i).setCount();
                    }
                }
            }
            System.out.println(menuItem.getName() + "이 장바구니에 추가되었습니다");
        } else {
            System.out.println("취소되었습니다");
        }
    }

    // 장바구니에 담긴 음식 주문 및 취소 기능 메서드
    private int shoppingCartOrderCancel() {
        if (!shoppingCart.getShoppingCartItems().isEmpty()) {
            System.out.println();
            System.out.println("[ ORDER MENU" + " ]");
            System.out.println("4. Orders       | 장바구니를 확인 후 주문합니다.\n5. Cancel       | 진행중인 주문을 취소합니다.");
            int chooseOrderMenu = io("메뉴를 선택해주세요 : ", 4, 5);
            if (chooseOrderMenu == 4) {
                System.out.println("[ Orders" + " ]");
                double sum = shoppingCart.sumPriceShowShoppingCart();
                System.out.println();
                System.out.println("[ Total" + " ]");
                System.out.println("W " + sum);
                System.out.println();
                System.out.println("1. 주문      2. 메뉴판");
                int chooseOrderAndMenu = io("번호를 선택해주세요 : ", 1, 2);
                if (chooseOrderAndMenu == 1) {
                    showDiscountMenu();
                    int chooseDiscountMenu = io("번호를 선택해주세요 : ", 1, 4);
                    switch (chooseDiscountMenu) {
                        case 1-> sum*=0.9;
                        case 2-> sum*=0.95;
                        case 3-> sum*=0.97;
                        default-> sum*=1;
                    }
                    System.out.println("주문이 완료되었습니다. 금액은 W " + String.format("%.1f", sum) + " 입니다");
                    shoppingCart.clearShoppingCartItems();
                } else {
                    System.out.println("메뉴판으로 되돌아갑니다");
                }
                return chooseOrderAndMenu;
            } else {
                System.out.println("진행중인 주문을 취소했습니다");
            }
        }
        return 0;
    }

    public void showDiscountMenu() {
        System.out.println("할인 정보를 입력해주세요.");
        for (Discount discount: Discount.values()) {
            System.out.println(discount.ordinal()+1 +". " + discount.getType() +" : " + discount.getDiscount());
        }
    }
}

ShoppingCart클래스

package com.example.kiosk;

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

public class ShoppingCart {
    private final List<MenuItem> shoppingCartItems;

    public ShoppingCart() {
        shoppingCartItems = new ArrayList<>();
    }

    // 장바구니 내역 보여주고 합계 계산 메서드
    public double sumPriceShowShoppingCart() {
        double sum;
//        for (MenuItem shoppingCartItem : shoppingCartItems) {
//            System.out.println(shoppingCartItem.toString());
//            sum += shoppingCartItem.getPrice();
//        }
        shoppingCartItems.forEach(item -> System.out.println(item.toString()));
        sum = shoppingCartItems.stream().mapToDouble(MenuItem::getPrice).sum();
        return sum;
    }

    public List<MenuItem> getShoppingCartItems() {
        return this.shoppingCartItems;
    }

    public void addShoppingCartItems(MenuItem menu) {
        this.shoppingCartItems.add(menu);
    }

    public void removeShoppingCartItems(int idx) {
        this.shoppingCartItems.remove(idx);
    }

    public void clearShoppingCartItems() {
        this.shoppingCartItems.clear();
    }
}

Discount enum클래스

package com.example.kiosk;

public enum Discount {
    PERSONOFNATIONALMERIT("10%","국가유공자"), ARMY("5%","군인"), STUDENT("3%","학생"), GENERALPERSON("0%","일반인");

    private final String discount;
    private final String type;

    Discount (String discount, String type) {
        this.discount=discount;
        this.type=type;
    }

    public String getDiscount() {
        return this.discount;
    }

    public String getType() {
        return this.type;
    }
}

마찬가지로 바뀐 클래스만 다시 올렸습니다.

어려웠던 부분

  • 도전 Lv2 람다 & 스트림 적용

해결 방법

  • 제출 기간 안에는 끝내지 못했지만 제출 기간이 끝나고 나서 stream에 대해 조금 더 알아본 후 ShoppingCart클래스의 장바구니 출력 및 합계 부분만 람다 & 스트림을 적용할 수 있게 됐다.

느낀 점

오늘 도전 기능 다 해보고자 도전했다. 하지만 람다 & 스트림을 직접 코드에 활용을 하려고 보니 어떻게 활용해야 하지? 쉬운 람다 스트림만 해봤지 막상 이런 코드에 적용은 안 해본 것이였다. 그렇게 enum까지만 하고 제출하게 되었다. 그래도 어제 개선사항 부분들 Map으로 바꾸는 것 빼곤 다 적용하긴 했다. Map은 조금 많이 걸릴 것 같아서 나중에 해보기로 하고 마무리 짓고 과제를 제출했다. 도전 기능 다 해보고 싶었지만 아직 부족하다는 것을 느꼈다.

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

0개의 댓글