Tiny Star

🏕️내일배움캠프/📂키오스크 시스템 만들기(23.05.26)

개인과제 - 키오스크 시스템 만들기

청크 2023. 6. 8. 14:33

스파르타 코딩클럽_내일 배움 캠프 spring 트랙 6기

[프로젝트] 키오스크 시스템 만들기

2023.05.26 ~ 2023.06.01

<프로젝트 정보>

개발도구 : IntelliJ

프로그래밍 언어 : Java

데이터베이스 : -

프레임워크 : -

라이브러리 : -

와이어프레임 : -

저장소 : GitHub

 

<프로젝트 내용>

자주가는 카페 메뉴로 키오스크 출력 시스템을 구현하였다.

[내가 작성한 코드]

KioskApp

package Kiosk;

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

public class KioskApp{

    public static void main(String[] args) {
        // 메인 카테고리 메뉴 HashMap 이용
        HashMap<Integer, String> menuList = new HashMap<Integer, String>();
        menuList.put(1, "1. ESPRESSO   | 에스프레소");
        menuList.put(2, "2. NON COFFEE | 카페인이 없는 주스&티");
        menuList.put(3, "3. DESSERT    | 다양한 디저트");
        menuList.put(4, "4. OREDER     | 장바구니 확인 후 주문합니다.");
        menuList.put(5, "5. CANCEL     | 진행중인 주문을 취소합니다.");


      //  배열 생성
        List espresso = new ArrayList();

      // 배열에 객체 입력(배열 안에 객체를 넣는다.)
        espresso.add(new Commodity("Cafe Espresso" ,"에스프레소, 설탕(설탕이 필요 없는 경우 미리 말씀해주세요.)", 2900)); //0
        espresso.add(new Commodity("Cafe Strapazzato","에스프레소, 설탕, 카카오", 3300)); //1
        espresso.add(new Commodity("Cafe Gege","에스프레소,카카오, 크림", 3800)); //2
        espresso.add(new Commodity("Cafe Romano","에스프레소, 설탕, 레몬",4300)); //3

        List nonCoffee = new ArrayList();

        nonCoffee.add(new Commodity("Orange Juice","100% 오렌지 주스",5000));
        nonCoffee.add(new Commodity("Chocolat Latte","40% 카카오 함량의 초콜릿과 우유",5000));
        nonCoffee.add(new Commodity("Black & Herb Tea","잉글리쉬 블랙퍼스트, 모로칸 미트, 애플앤블랙베리",5000));
        nonCoffee.add(new Commodity("Yuzu Green Tea","유자차와 그린티",5500));
        nonCoffee.add(new Commodity("Cherry Lemonade","파브리 체리, 레몬, 탄산수",5500));

        List dessert = new ArrayList();

        dessert.add(new Commodity("Salted Butter Bread","좋은 질감과 풍미가 가득한 빵",3500));
        dessert.add(new Commodity("Twist Stick","40% 페스츄리 질감의 달콤한 꽈배기 빵",2300));


        List orderList = new ArrayList(); //주문 리스트를 받기 위한 오더 리스트 생성

        Scanner scanner = new Scanner(System.in); // 입력 값
        System.out.println(Order.title);
        Commodity commodity = new Commodity(); // Commodity 인스턴스를 생성


        while (true) { //메인 메뉴판 : 1번화면
            System.out.println(" ========= [CONNECTS MENU] ========= ");
            System.out.println("아래 상품 메뉴판을 보시고, 상품을 골라 입력해주세요.");
            System.out.println();
            System.out.println(menuList.get(1));
            System.out.println(menuList.get(2));
            System.out.println(menuList.get(3));
            System.out.println(menuList.get(4));
            System.out.println(menuList.get(5)); // HashMap 호출
            System.out.println("선택 : ");
            int order = scanner.nextInt(); // 유저가 선택한 번호를 변수 int order에 저장
            // 유저 번호 선택에 따른 메뉴판 출력
            if (order == 1) {
                commodity.output(espresso); //에스프레소 종류가 commodity 메서드 출력
                //에스프레소 선택 시
                Scanner scanner1 = new Scanner(System.in); // 메뉴선택 스캐너
                String input1 = scanner1.nextLine(); // 유저가 입력한 특정 숫자값받기
                int num1 = Integer.parseInt(input1); // 형변환

                Commodity espressoList = (Commodity) espresso.get(num1-1); // 고객이 입력한 내용
                System.out.println(espressoList.name + " | " + espressoList.explanation + " | " + espressoList.price); // 메뉴의 이름, 설명, 가격 가져오기

                System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
                System.out.println("1. 확인   2. 취소");
                Scanner scanner2 = new Scanner(System.in); // 확인 또는 취소를 누를 수 있는 스캐너 메서드
                String input2 = scanner2.nextLine();
                int num2 = Integer.parseInt(input2); // 특정 숫자값받기
                if (num2 == 1) {
                    orderList.add(espressoList); // 고객이 선택한 메뉴 장바구니에 저장
                    System.out.println("선택하신 메뉴가 장바구니에 추가되었습니다.");
                } else {
                    // 취소 선택 시 메인 메뉴로 돌아가기
                }
            } else if (order == 2) {
                commodity.output(nonCoffee);
                //주스&티 선택 시
                Scanner scanner1 = new Scanner(System.in);
                String input1 = scanner1.nextLine();
                int num1 = Integer.parseInt(input1); // 특정 숫자값받기
                Commodity nonCoffeeList = (Commodity) nonCoffee.get(num1-1);
                System.out.println(nonCoffeeList.name + " | " + nonCoffeeList.explanation + " | " + nonCoffeeList.price);
                System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
                System.out.println("1. 확인   2. 취소");
                Scanner scanner2 = new Scanner(System.in);
                String input2 = scanner2.nextLine();
                int num2 = Integer.parseInt(input2); // 특정 숫자값받기
                if (num2 == 1) {
                    orderList.add(nonCoffeeList);
                    System.out.println("선택하신 메뉴가 장바구니에 추가되었습니다.");
                } else {

                }
            } else if(order == 3) {
                commodity.output(dessert);
                //디저트 선택 시
                Scanner scanner1 = new Scanner(System.in);
                String input1 = scanner1.nextLine();
                int num1 = Integer.parseInt(input1); // 특정 숫자값받기
                Commodity dessertList = (Commodity) dessert.get(num1-1);
                System.out.println(dessertList.name + " | " + dessertList.explanation + " | " + dessertList.price);
                System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
                System.out.println("1. 확인   2. 취소");
                Scanner scanner2 = new Scanner(System.in);
                String input2 = scanner2.nextLine();
                int num2 = Integer.parseInt(input2); // 특정 숫자값받기
                if (num2 == 1) {
                    orderList.add(dessertList);
                    System.out.println("선택하신 메뉴가 장바구니에 추가되었습니다.");
                } else {

                }
            } else if(order == 4) {
                System.out.println("주문내역을 확인합니다.");
                System.out.println("[Order]");
                commodity.outputOrder(orderList); // orderList 를 불러오기 위한 메서드 호출
                System.out.println("1. 주문    2. 메뉴판");

                Scanner scanner1 = new Scanner(System.in); // Scanner 객체(입력)
                String input = scanner1.nextLine(); // Scanner의 메서드를 사용 input에 String값 넣음
                int order1 = Integer.parseInt(input); // 받은 S1tring을 Int로 형변환

                if(order1 == 1) {
                    System.out.println("주문이 완료되었습니다!");
                    System.out.println("대기번호는 [ 1 ] 번 입니다."); //아직 구현할 수 없는 영역...
                    System.out.println("(2초 후 메뉴판으로 돌아갑니다.)");
                    // n초 후 메뉴판 돌려야함
                    orderList.clear();
                    Order.stop2Second(); // 2초후에 돌아가는 영역

                } else {
                    System.out.println("메인 메뉴판으로 돌아갑니다.");
                    // 메뉴판으로 돌아가는 영역
                }

            } else if(order == 5) {
                System.out.println("진행하던 주문을 취소하시겠습니까?");
                System.out.println("1.주문초기화     2.메인화면으로 돌아가기");
                Scanner scanner3 = new Scanner(System.in); // Scanner 객체
                String input = scanner3.nextLine(); // Scanner 의 메서드를 사용 input 에 String 값 넣음
                int cancel = Integer.parseInt(input); // 받은 String 을 Int 로 형변환
                if(cancel == 1) {
                    orderList.clear(); // 고객이 주문을 받았던 내역을 초기화
                } else {
                    System.out.println("메인 메뉴판으로 돌아갑니다."); // 초기화 없이 메인 메뉴판으로 돌아가게 해줌
                }
            } else {
                System.out.println("잘못된 입력입니다.");
            }
        }

    }
}

Comodity (Menu class 상속)

package Kiosk;

import java.util.List;

public class Commodity extends Menu {
    // 커피의 종류, 종류별로 설명, 종류별로 가격
    // 메뉴 이름과 설명은 Menu class 에서 상속받아옴
    double price; // 제품의 가격


    public Commodity() {
    } //기본 생성자

    public Commodity(String name, String explanation, double price) {
        super(name, explanation); // 상속받아 온 조상의 생성자를 호출할 때 사용
        this.price = price;
    } //매개변수가 있는 생성자

    public void output(List list){
        for (int i = 0; i < list.size(); i++) {
            Commodity menuList2 = (Commodity) list.get(i);
            System.out.println(i+1 + "." + menuList2.name + " | " + menuList2.explanation + " | " + menuList2.price);
        } // 메뉴 리스트를 출력
    } //메뉴 리스트를 위한 메서드
    public void outputOrder(List list){ // Order 선택 시 오더
        double totalPrice = 0.0; // 가격 값을 초기화

        for (int i = 0; i < list.size(); i++) {
            Commodity menuList2 = (Commodity) list.get(i);
            System.out.println(menuList2.name + " | " + menuList2.explanation + " | " + menuList2.price);
            totalPrice += menuList2.price; //가격 합산
        }
        System.out.println("[TOTAL]");
        System.out.println("W " + totalPrice); //유저가 선택한 메뉴의 가격 Total(합산)한 숫자출력

    } // 주문내역 합산 메서드
}

Menu

package Kiosk;

public class Menu {
    // 커피, 주스, 디저트 큰 카테고리
    String name; //메뉴 이름
    String explanation; // 메뉴 설명

    public Menu() {
    } //기본 생성자

    public Menu(String name, String explanation) {
        this.name = name;
        this.explanation = explanation;
    } //매개변수가 있는 생성자
}

Order

package Kiosk;

public class Order {
    public static String title = "Welcome to Connects Coffee Espresso Bar";
    public static void stop2Second() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.getMessage();
        } //2초 기다렸다가 메뉴로 돌아가기
    }

}

 

그리고 튜터님의 피드백

"고생많으셨습니다. :) if-else문 중복이 많은데, 조건문 처리하는 다른 방법을 찾아보시고 적용하시면 좋을 것 같아요.
이 외에 Map 형태를 이해하고 활용하신 점이 좋습니다. 좀 더 세부적으로 method를 분리하고,
적절히 활용하면 가독성이 높아질 수 있습니다. input 값을 매번 String으로 받아 int로 변환해주셨는데,
Scanner의 method들을 알아보시고, 변환하지 않고 입력받는 방법을 찾아보시면 좋을 것 같습니다.
깃 활용도가 낮으니 git flow와 같이 실제 git 활용하는 다양한 방법을 찾아보고 적용해보시길 바랍니다."

처음에 과제 제출할 때 걱정됬던 부분을 딱 집어주셨다.

내가봐도 if-else 중복이 많아보였고 swich문으로 처리하려고 노력도 해봤으나... if문이 가장 쉬웠다..

 

method 작성하고 불러오는게 익숙하지 않지만, 더 많이 연습해서 피드백 받은대로 좀 더 깔끔한 코드를 작성할 수 있도록 노력해야겠다.