개발 낙서장

JAVA 개인 과제 - 키오스크 만들기 - 3일차 본문

Java/Sparta

JAVA 개인 과제 - 키오스크 만들기 - 3일차

권승준 2024. 1. 10. 17:56

이전 글

https://dachomi97.tistory.com/64

 

JAVA 개인 과제 - 키오스크 만들기 - 2일차

이전 글 https://dachomi97.tistory.com/60 JAVA 개인 과제 - 키오스크 만들기 - 1일차 과제 소개 📢 내가 좋아하는 카페 또는 패스트푸드점의 키오스크를 만들어보자! 지금까지 배워온 Java 언어를 사용하여

dachomi97.tistory.com

기능 추가

이제 새로운 기능을 추가할 차례이다.
히든 입력값인 0을 누르면 가게 매출, 주문 내역, 상품 추가 및 삭제 등 실제 가게에서 하는 작업들과 유사한 기능들을 추가할 것이다.

먼저 매출이나 주문 내역 등을 보려면 손님이 주문할 때마다 가게 데이터에 이를 저장해야 한다.
주문 번호, 주문 상품, 가격, 주문 시간 등을 담는 Order 클래스를 만들어 관리하면 될 것 같다.

package Data;

import Menu.Product;

import java.time.LocalDate;
import java.time.LocalTime;
import java.util.List;

public class Order {
    int orderNumber;
    List<Product> orderList;
    LocalDate date;
    LocalTime time;

    public Order(int orderNumber, List<Product> orderList) {
        this.orderNumber = orderNumber;
        this.orderList = orderList;
        date = LocalDate.now();
        time = LocalTime.now();
    }
}

java8 부터 java.time 패키지에서 날짜와 시간을 알 수 있는 클래스를 제공한다.
간단하게 주문 번호, 주문 상품 리스트, 날짜와 시간을 저장하는 Order 클래스를 만들었다.

그리고 Management 클래스이다.
가게 관리에 대한 기능이 들어가는 클래스이다.
외부에서 메서드를 호출해 여러가지 기능들을 수행할 수 있게 했다.

package Data;

import Menu.Product;

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

public class Management {
    List<Order> orderList = new ArrayList<>();
    Double sales = 0.0;

    public void showHistory() {
        for(Order o : orderList) {
            System.out.println(o.orderNumber + "번 주문 (" + o.date + " " + o.time.getHour() + ":" + o.time.getMinute() + ":" + o.time.getSecond());
            for(Product p : o.orderList) {
                System.out.printf("- %-30s | %-10s\n", p.getName(), p.getPrice());
            }
            System.out.println("\n");
        }
    }

    public void showSales() {
        System.out.println("가게 총 매출 : " + sales.intValue());
    }

    public Product addNewProduct() {
        try {
            System.out.print("\n상품 이름 : ");
            String name = new Scanner(System.in).nextLine();

            System.out.print("\n상품 가격 : ");
            Double price = new Scanner(System.in).nextDouble();

            System.out.print("\n상품 설명 : ");
            String desc = new Scanner(System.in).nextLine();

            return new Product(name, desc, price);
        } catch (Exception e) {
            System.out.println("올바르지 않은 입력입니다.\n상품 추가에 실패했습니다.");

            return null;
        }
    }

    public void addOrder(int orderNumber, List<Product> productList) {
        orderList.add(new Order(orderNumber, productList));

        for(Product p : productList)
            sales += p.getPrice();
    }
}

 

이에 맞춰 KioskApp 클래스도 수정해줬다.
0번을 입력하면 히든 조작으로 관리 메뉴로 넘어가게 되고 이후에 조작에 따른 주문 내역 조회, 매출 조회, 메뉴 추가, 메뉴 삭제 등의 작업을 진행할 수 있도록 했다.

    void ShowManagement() {
        System.out.println("[ 가게 관리 ]");
        System.out.println("1. 주문 내역");
        System.out.println("2. 가게 매출");
        System.out.println("3. 메뉴 추가");
        System.out.println("4. 메뉴 삭제\n");

        System.out.print("입력 : ");
        try {
            int answer = sc.nextInt();

            switch (answer) {
                case 1:
                    management.showHistory();
                    break;
                case 2:
                    management.showSales();
                    break;
                case 3:
                    ShowAddProduct();
                    break;
                case 4:
                    ShowRemoveProduct();
                    break;
            }
        } catch (Exception e) {
            WrongInput();
        }

        try {
            System.out.println("\n관리 메뉴로 돌아가려면 1을, 메인 화면으로 돌아가려면 2를 입력하세요.");
            int answer = sc.nextInt();

            if (answer == 1) {
                ShowManagement();
            } else {
                ShowMainTimer(3000);
            }
        } catch (Exception e) {
            WrongInput();
        }
    }

    void ShowAddProduct() {
        int index = 1;

        System.out.println("상품을 추가할 메뉴를 골라주세요.");
        List<String> menuNames = md.getProductMap().keySet().stream().toList();

        for (String name : menuNames) {
            System.out.println(index++ + ". " + name);
        }

        try {
            System.out.print("입력 : ");
            int answer = sc.nextInt();

            String menuName = menuNames.get(answer - 1);

            Product product = management.addNewProduct();

            if (product != null) {
                if (md.addProduct(menuName, product)) {
                    System.out.println("\n[ " + product.getName() + " ] 상품이 추가되었습니다.");
                } else {
                    System.out.println("\n[ " + product.getName() + " ] 상품 추가에 실패했습니다.");
                }
            }
        } catch (Exception e) {
            WrongInput();
        }
    }

    void ShowRemoveProduct() {
        int index = 1;

        System.out.println("상품을 제거할 메뉴를 골라주세요.");
        List<String> menuNames = md.getProductMap().keySet().stream().toList();

        for (String name : menuNames) {
            System.out.println(index++ + ". " + name);
        }

        try {
            System.out.print("입력 : ");
            int answer = sc.nextInt();
            sc.reset();

            String menuName = menuNames.get(answer - 1);

            System.out.println("\n제거할 상품을 골라주세요.");
            index = 1;
            for(Product p : md.getProducts(menuName)) {
                System.out.println(index++ + ". [ " + p.getName() + " ] " + p.getPrice() + "원");
            }

            System.out.print("입력 : ");
            answer = sc.nextInt();

            Product product = md.getProducts(menuName).get(answer - 1);

            if (product != null) {
                if (md.removeProduct(menuName, product)) {
                    System.out.println("\n[ " + product.getName() + " ] 상품이 제거되었습니다.");
                } else {
                    System.out.println("\n[ " + product.getName() + " ] 상품 제거에 실패했습니다.");
                }
            }
        } catch (Exception e) {
            WrongInput();
        }
    }

위의 코드를 추가해줬다.
상품 추가와 삭제는 MenuData 클래스에서 구현한 맵을 가져오는 메소드 등을 활용했다.
추가/삭제할 카테고리를 입력받고 추가할 때는 상품의 정보를, 삭제할 때는 삭제할 상품을 입력해 예외 처리를 하여 작업이 완료되도록 했다.
상품이나 메뉴에 관한 정보는 전부 MenuData 클래스에 있으니 해당 클래스에서 추가, 삭제 메소드를 만들어서 사용했다.

실행 화면

 

Comments