키오스크 #2 - 필수 기능

김지현·2023년 10월 23일
3

JAVA

목록 보기
11/14

필수 기능

  1. 메인 메뉴판 : 상품 메뉴 출력, Order(주문), Cancel(주문 취소) 옵션 출력
  2. 상품 메뉴판 : 상품 메뉴 선택 시 해당 카테고리 메뉴판 출력, 각 메뉴의 이름, 가격, 설명 출력
  3. 구매 화면 : 상품 선택 시 해당 상품을 장바구니에 추가 → 메인 메뉴 재출력
  4. 주문 화면 : Order 선택 시 장바구니 목록 출력(상품 목록, 총 가격)
  5. 주문 완료 화면 : 장바구니에서 주문 선택 시 주문 완료(대기 번호 발급, 장바구니 초기화) → 3초 후 메인 메뉴 재출력
  6. 주문 취소 화면 : Cancel 선택 시 장바구니 초기화 → 메인 메뉴 재출력

메인 메뉴판

Main
우선 메인 함수에서 메뉴 리스트, 상품 리스트를 생성

public class Main {
    public static ArrayList<Menu> mainMenuList = new ArrayList<>();		// 메인 메뉴 리스트
    public static Order order = new Order();	// Order 객체 생성

    public static void displayMainMenu(){
        // 메인 메뉴 출력
    }

    public static void main(String[] args) { 
    	
        // 메인 (메뉴 리스트) 생성
        Menu coffeeMenu = new Menu("Coffee", "스타벅스만의 아라비카 커피");
        mainMenuList.add(coffeeMenu);
        ...
        
        // 커피, 스무디, 디저트, 빵 (상품 리스트) 생성
         coffeeMenu.menuList.add(new Products("Espresso", "에스프레소 설명", 4000));
         coffeeMenu.menuList.add(...);
         ...
         
         // 메인 메뉴 실행
        displayMainMenu();
    }

displayMainMenu 메서드에서 메뉴 화면 실행 부분을 구현

public static void displayMainMenu(){
        // 메인 메뉴 출력
        System.out.println("Starbucks에 오신 것을 환영합니다.");
        System.out.println("\n[ MENU ] ");

		// 메뉴 리스트 출력
        int i = 1;
        for(Menu m : mainMenuList)      
            System.out.println(i++ + ". " + m.getName() + " | " + m.getScript());

        System.out.println("\n[ ORDER ] ");
        System.out.println(i++ + ". " + order.getName() + " | " + order.getScript());
        System.out.println(i + ". " + "Cancel" + " | " + "진행중인 주문을 취소합니다.");

        inputMenu();      // 메뉴 입력
    }
  • 메인 출력 화면

메뉴 번호 선택시 동작하는 부분은 inputMenu 메서드에 구현
원래 displayMainMenu 안에 있던 부분이지만 잘못된 입력시 재실행이 용이하기 위해, 그리고 코드를 알아보기 편하게 하기 위해 inputMenu 메서드를 따로 생성했다.

  • 1, 2, 3, 4 (상품 메뉴) : 상품 메뉴 리스트 출력
  • 5 (Order) : order 객체의 displayOrder 메서드 실행
  • 6 (Cancel) : order 객체의 clearOrder 메서드 실행
  • else : 잘못된 입력이므로 inputMenu 메서드 재실행
public static void inputMenu(){
        // 메뉴 입력
        System.out.print("\n메뉴 번호를 선택해주세요 : ");
        int select = sc.nextInt();

        if(select == 1 || select == 2 || select == 3 || select == 4) {
            Menu m = mainMenuList.get(select - 1);          // 해당 메뉴 객체 선택
            order.addList(m.displayMenu());                 
            // 상품 메뉴 리스트 출력 -> 상품 선택 -> 상품 객체 return -> 장바구니 추가
        }
        else if(select == 5) {
            order.displayOrder();                           // 장바구니 출력
        }
        else if(select == 6){
            System.out.println("진행하던 주문을 취소하시겠습니까?");
            System.out.print("\n1.Yes  2.No\n입력 : ");
            select = sc.nextInt();

            if(select == 1){
                order.clearOrder();                         // 장바구니 비우기
                System.out.println("\n진행하던 주문이 취소되었습니다.");
            }
            displayMainMenu();
        }
        else{
            System.out.println("잘못된 입력입니다.");
            inputMenu();                                   // 잘못된 입력일 경우 재실행
        }
    }

상품 메뉴판

Menu Class
displayMenu 메서드로 상품 메뉴판을 출력하고 상품 번호를 입력받아서 리스트에서 해당 객체를 찾아 return 한다.

public class Menu {
    private String name;
    private String script;
    public ArrayList<Products> menuList = new ArrayList<>(); 	// 상품 객체 리스트로 저장

    public Menu(String name, String script){
        this.name = name;
        this.script = script;
    }

    public Products displayMenu() {
        Scanner sc = new Scanner(System.in);

        // 상품 메뉴판 출력
        System.out.println("[ " + this.name + " MENU ] ");
        int i = 1;
        for (Products p : menuList)
            System.out.println(i++ + ". " + p.getName() + " | \u20A9 " + p.getPrice() + " | " + p.getScript());

        // 상품 입력
        System.out.print("\n상품 번호를 입력해주세요 : ");
        int select = sc.nextInt();
        return menuList.get(select - 1);      // 선택한 상품 객체 return
    }
}
  • 상품 메뉴판 화면

구매 화면

Order Class
Order Class에 가장 많은 메서드가 있다. 장바구니와 관련된 동작들은 모두 해당 클래스에 구현했더니 이렇게 된듯하다

public class Order {
    ArrayList<Products> orderList = new ArrayList<>();		// 장바구니 리스트
    int totalPrice;						// 총 주문 금액
    int waitingNum = 1;					// 대기번호
    private String name = "Order";
    private String script = "장바구니를 확인 후 주문합니다.";
    Scanner sc = new Scanner(System.in);
}

addList : 장바구니에 상품 추가

public void addList(Products p){
// (displayMenu()에서) 전달 받은 상품 객체 장바구니에 추가
        Scanner sc = new Scanner(System.in);
        System.out.println("\n" + p.getName() + " | \u20A9 " + p.getPrice() + " | " + p.getScript());
        System.out.println("\n위 메뉴를 장바구니에 추가하시겠습니까?");
        System.out.print("1.확인  2.취소\n입력 : ");
        String select = sc.nextLine();

        if(select.equals("확인")) {
            orderList.add(p);			// 리스트에 추가
            totalPrice += p.price;		// 총 가격 업데이트
            System.out.println(p.getName()+" 장바구니에 추가되었습니다.");
            Main.printMainMenu();
        }
    }
  • 구매 화면

주문 화면

displayOrder : 장바구니 화면 출력 및 주문

public void displayOrder(){
        // 장바구니 출력
        System.out.println("[ Orders ]");
        
   		// 장바구니 내역 출력
   		int i = 1;
        for (Products p : orderList)
            System.out.println(i++ + ". " + p.getName() + " | \u20A9 " + p.getPrice());

        System.out.println("\n[ Total ]");
        System.out.println("\u20A9 " + totalPrice);         // 총 가격 출력

        System.out.print("\n1.Order  2.Main menu");
        System.out.print("\n입력 : ");
        int select = sc.nextInt(); 
        if(select == 1) {
         	clearOrder();    // 장바구니 초기화
        	System.out.println("주문이 완료되었습니다!\n");
        	System.out.println("대기번호는 [ " + waitingNum++ +" ] 번 입니다.");
        	System.out.println("(3초 후 메뉴판으로 돌아갑니다.)");
        	waitMain();     // 3초 후 메뉴판 실행
        }
        else  {
           if(select != 2) System.out.println("잘못된 입력 입니다.");
           Main.displayMainMenu();
        }                      
    }
  • 주문, 주문 완료 화면

clearOrder : 장바구니 초기화
waitMain : 3초후 메인 메뉴판 실행

public void clearOrder(){
    orderList.clear();
    totalPrice = 0;
}
    
public void waitMain(){
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // 크기가 1인 스레드 풀 생성
    scheduler.schedule(() -> {		// 스케줄된 작업 정의
        Main.displayMainMenu();		// 메인 메뉴판 실행
    }, 3, TimeUnit.SECONDS);		// 초 단위, 3초뒤
    scheduler.shutdown();			// 스레드 풀 종료
}       

취소 화면

MaininputMenu 메서드 내에 if문으로 구현

public static void inputMenu(){
	else if(select == 6){
    	System.out.println("진행하던 주문을 취소하시겠습니까?");
        System.out.print("\n1.Yes  2.No\n입력 : ");
        select = sc.nextInt();

        if(select == 1){
            order.clearOrder();            // 장바구니 초기화
            System.out.println("\n진행하던 주문이 취소되었습니다.");
        }
        displayMainMenu();
    }
}
  • 취소 화면 출력
profile
Server Developer

0개의 댓글