230530(화)-TIL

조우진·2023년 5월 30일
0

TIL

목록 보기
9/28

오늘 수행한 내용

  • 개인과제 : 키오스크 만들기(진행중)

키오스크 만들기

  1. 메뉴판을 보고 주문
  2. 화면 심플하게 출력
  3. 메뉴 클래스와 주문 클래스 사용하여 Java 상속 최대한 사용하기

필요 기능

  1. 메인 메뉴판 화면 메뉴카테고리 (버거류, 음료류 등), 주문하기/취소하기

  2. 상품 메뉴판 화면 선택한 카테고리의 메뉴.

  3. 상품 선택 시 장바구니 추가 확인 문구
    3-1. 확인 시 1번화면으로 이동. 장바구니에 메뉴 추가
    3-2. 취소 시 2번화면으로 복귀

  4. 5.order입력 시 현재 장바구니 목록을 출력
    4-1. 추가된 메뉴들과 총 가격 합을 출력
    4-2. 1.주문 입력 시 주문완료화면으로 이동, 2. 메뉴판 입력 시 메인메뉴로 복귀

5.주문완료 및 대기번호 발급

설계 필수 사항

메뉴 클래스 : 이름, 설명 필드를 가지는 클래스(카테고리)
상품 클래스 : 이름, 가격, 설명 필드를 가지는 클래스 - 메뉴클래스 상속받기
주문 클래스 : 상품 객체를 담기

선택 요구사항

  1. 장바구니에 담긴 상품은 주문화면에서 갯수가 출력되도록 하기
  2. 상품에 옵션 선택 후, 사이즈 추가하기

현재까지 완료된 기능

  1. 메인 메뉴판 출력
  2. 메뉴카테고리 선택 시, 해당 카테고리의 상품 메뉴판 출력
  3. 상품 선택 시 장바구니 추가 확인 문구
    3-1. 확인 시 장바구니 메뉴 추가
    3-2. 취소 시 2번 화면으로 복귀
  4. 5.order 입력 시 현재 장바구니 목록 출력
    4-1. 추가된 메뉴들과 총 가격 합을 출력
  5. 주문완료 및 대기번호 발급

아직 구현하지 못한 기능

4-2. 1.주문 입력 시 주문완료화면으로 이동, 2. 메뉴판 입력 시 메인메뉴로 복귀

Main.java

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Menu menu = new Menu();
        while (true) {
            Product product = new Product(menu.show());// menu.show() : 메인 메뉴판. int 값을 리턴받아 어떤 카테고리메뉴를 선택했는지 반환
            product.selectProduct(); //상품 메뉴판. 앞 줄에서 선택한 카테고리 메뉴판을 보여줌.
        }
    }
}

Menu.java

  • 카테고리(버거, 음료, ...) 메뉴 정보를 가진 2차원 배열 shakeshackMenu
  • 메뉴판을 보여주는 show() 메서드 - 자식 객체인 product클래스에서도 show()메서드 사용
    • product클래스의 상황에 맞는 메뉴를 보여줄 수 있도록 setter(setMenu) 선언
  • 1~4입력 시 : 카테고리 메뉴판
  • 5 입력 시 : Order클래스 endOrder호출 (현재 장바구니에서의 주문 상태 출력 및 주문확정)
  • 6 입력 시 : Order클래스 cancelOrder호출 (장바구니 초기화 및 주문취소 확인)
public class Menu {
    //1) 고유 데이터 영역
    int number;
     String name = "SHAKESHACK";
    static final String[][] shakeshackMenu = {
            {"Burgers", "", "앵거스 비프 통살을 다져 만든 버거"},
            {"Frozen Custard", "", "매장에서 신선하게 만드는 아이스크림"},
            {"Drinks", "", "매장에서 직접 만드는 음료"},
            {"Beer", "", "뉴욕 브루클린 브루어리에서 양조한 맥주"}
    };
    String[][] menu = Arrays.copyOf(shakeshackMenu,shakeshackMenu.length);//상황에 맞는 메뉴를 보여줄 그릇
    Scanner sc = new Scanner(System.in);
    //setter
    void setMenu(String name, String[][] menu){
        this.name = name;
        this.menu = Arrays.copyOf(menu,menu.length);
    }

    //메서드 영역
    public int show() throws InterruptedException {
        int number;
        System.out.println("\"SHAKESHACK BURGER 에 오신 걸 환영합니다.\"");

        if(name.equals("SHAKESHACK"))
            System.out.println("아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.");
        else
            System.out.println("아래 상품 메뉴판을 보시고 상품을 골라 입력해주세요.");

        System.out.println("[ "+this.name+" MENU ]");
        for(int i=0; i<this.menu.length; i++) { // 메뉴판 내 목록 표시
            System.out.print(i+1+". "+this.menu[i][0]+" | "); //메뉴
            if(!menu[i][1].equals(""))
                System.out.print("W " +menu[i][1] + " | ");  //가격
            System.out.println(this.menu[i][2]);             //설명

        }
        if(name.equals("SHAKESHACK")) {
            System.out.println("[ ORDER MENU ]");
            System.out.println("5. Order   | 장바구니를 확인 후 주문합니다.");
            System.out.println("6. Cancel  | 진행중인 주문을 취소합니다.");
            number = sc.nextInt();
            if (number == 5) {
                Order.endOrder();
            } else if (number == 6) {
                Order.cancelOrder();
            }
        }
        else number = sc.nextInt();


        return number;

    }


}

Product.java

  • 각 카테고리별 메뉴정보를 가진 2차원배열 (burgersMenu, frozencustardMenu, ...)
  • 선택한 카테고리에 맞는 메뉴를 출력하기 위해 Menu클래스의 setter 사용
  • 선택한 상품을 order클래스의 addOrder 호출하여 처리
  • Arrays.copyOf()메서드를 활용한 2차원 배열 깊은 복사
public class Product extends Menu {
    int number;
    double price;
    final String[][] burgersMenu = {
            {"ShackBurger   ", "6.9", "토마토, 양상추, 쉑소스가 토핑된 치즈버거"},//메뉴,가격,설명
            {"SmokeShack    ", "8.9", "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"},
            {"Shroom Burger ", "9.4", "몬스터 치즈와 체다 치즈로 속을 채운 베지테리안 버거"},
            {"Cheeseburger  ", "5.4", "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"},
            {"Hamburger     ", "6.9", "비프패티를 기반으로 야채가 들어간 기본버거"}
    };

    final String[][] frozencustardMenu = {
            {"Shakes           ", "5.9", "바닐라, 초콜렛, 솔티드 카라멜, 블랙 & 화이트, 스트로베리, 피넛 버터, 커피"},
            {"Shake of the Week", "6.5", "특별한 커스터드 플레이버"},
            {"Red Bean Shake   ", "6.5", "신선한 커스터드와 함께 우유와 레드빈이 블렌딩 된 시즈널 쉐이크"},
            {"Floats           ", "5.9", "루트 비어, 퍼플 카우, 크림 시클"},
            {"Cups & Cones     ", "4.9", "바닐라, 초콜렛, Flavor of the Week"},
            {"Concretes        ", "5.9", "쉐이크쉑의 쫀득한 커스터드와 다양한 믹스-인의 조합"},
            {"Shack Attack     ", "5.9", "초콜렛 퍼지소스, 초콜렛 트러플 쿠키, Lumiere 초콜렛 청크와 스프링클이 들어간 진한 초콜렛 커스터드"}
    };

    final String[][] drinksMenu = {
            {"Shack-made Lemonade  ", "3.9", "매장에서 직접 만드는 상큼한 레몬에이드(오리지날/시즈널)"},
            {"Fresh Brewed Iced Tea", "3.4", "직접 유기농 홍차를 우려낸 아이스티"},
            {"Fifty/Fifty          ", "3.5", "레몬에이드와 아이스티의 만남"},
            {"Fountain Soda        ", "2.7", "코카콜라, 코카콜라 제로, 스프라이트, 환타 오렌지, 환타 그레이프"},
            {"Abita Root Beer      ", "4.4", "청량감 있는 독특한 미국식 무알콜 탄산음료"},
            {"Bottled Water        ", "1.0", "지리산 암반대수층으로 만든 프리미엄 생수"}
    };


    final String[][] beersMenu = {
            {"ShackMeister Ale  ", "9.8", "쉐이크쉑 버거를 위해 뉴욕 브루클린 브루어리에서 특별히 양조한 에일 맥주"},
            {"Magpie Brewing Co.", "6.8", "설명 없음"}
    };

    // Order클래스에 전달할 메뉴, 설명
    static String[][] orderMenu;

    public Product(int number) {
        this.number = number;
    }

    public int selectProduct() throws InterruptedException {
        String name = menu[number - 1][0].trim();
        switch (name) {
            //선택한 카테고리의 메뉴들을 작성해서 보여줌
            case "Burgers": {
                orderMenu = Arrays.copyOf(burgersMenu, burgersMenu.length); // 깊은복사
                break;
            }

            case "Frozen Custard": {
                orderMenu = Arrays.copyOf(frozencustardMenu, frozencustardMenu.length); // 깊은복사
                break;
            }

            case "Drinks": {
                orderMenu = Arrays.copyOf(drinksMenu, drinksMenu.length); // 깊은복사
                break;
            }

            case "Beer": {
                orderMenu = Arrays.copyOf(beersMenu, beersMenu.length); // 깊은복사
                break;
            }
        }
        setMenu(name, orderMenu);//부모객체의 setter 통해 카테고리에 맞는 메뉴판으로 변경
        int result = show();//메뉴판을 보여주고, 선택 번호 리턴
        String[] target = {orderMenu[result - 1][0], orderMenu[result - 1][1], menu[result - 1][2]}; //선택한 번호의 배열 저장
        Order.addOrder(result, target);

        return 1;
    }
}

Order.java

  • 장바구니에 메뉴를 추가하는 addOrder()
  • 주문을 완료하고 선택 메뉴에 대한 가격을 정산하는 endOrder()
  • 주문내용을 취소하는 cancelOrder()
public class Order {

    static ArrayList<String[]> shoppingBag = new ArrayList<String[]>(); // 메뉴를 담을 장바구니
    static int counter = 0;

    public static void addOrder(int number, String[] menu){
        Scanner sc = new Scanner(System.in);

        System.out.print(menu[0]+" | ");            //메뉴
        System.out.print("W " +menu[1] + " | ");   //가격
        System.out.println(menu[2]);              //설명

        System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
        System.out.println("1.확인          2.취소");
        if(sc.nextInt() == 1){
            System.out.println(menu[0].trim()+"가 장바구니에 추가되었습니다.");
            shoppingBag.add(menu);

//            System.out.println(Arrays.toString(shoppingBag.get(0)));
        }

//        sc.close();
    }
    public static void endOrder() throws InterruptedException {
        double totalprice= 0;
        Scanner sc = new Scanner(System.in);
        System.out.println("아래와 같이 주문하시겠습니까?");
        System.out.println("[ Orders ]");
        for (String[] item :shoppingBag) {
            System.out.print(item[0] + " | ");            //메뉴
            System.out.print("W " + item[1] + " | ");   //가격
            System.out.println(item[2]);              //설명
            totalprice += Double.parseDouble(item[1]); //가격계산
        }
        System.out.println("[ Total ]");
        System.out.println("W "+totalprice+"\n");
        System.out.println("1. 주문     2. 메뉴판");
        if(sc.nextInt()==1){
            counter +=1;
            System.out.println("주문이 완료되었습니다!");
            System.out.println("대기번호는 [ "+counter+" ]번 입니다.");

            System.out.println("(3초 후 메뉴판으로 돌아갑니다.)");
            Thread.sleep(1000);
            System.out.println("(2초 후 메뉴판으로 돌아갑니다.)");
            Thread.sleep(1000);
            System.out.println("(1초 후 메뉴판으로 돌아갑니다.)");
            Thread.sleep(1000);
            shoppingBag.clear();
        }
    }
    public static void cancelOrder(){
        int response;
        Scanner sc = new Scanner(System.in);
        System.out.println("진행하던 주문을 취소하겠습니까?");
        System.out.println("1. 확인     2. 취소");
        response = sc.nextInt();
        if(response == 1)
        {
            shoppingBag.clear();
            System.out.println("진행하던 주문이 취소되었습니다.");
        }
    }

}

구현 상세
1. 카테고리 메뉴판 출력

2. 선택한 카테고리에 맞는 상품 메뉴판 출력

3. 상품 선택 시 장바구니 추가 확인 문구

4. 확인 시, 장바구니 추가 및 최초 메뉴판으로 이동

5. Order 선택 시, 현재까지 추가된 장바구니 내용 출력 및 총 가격 출력

6. 주문 선택 시 대기번호 출력 및 종료

금일 마주친 문제

1.

오후에 팀원들과 자신의 코드를 리뷰하는 시간을 가졌는데, 나의 긴 코드를 말로 설명하려다 보니 설명이 장황해져 이해하기 어려운 코드리뷰가 되었다.

Try

다이어그램을 작성하여, 먼저 내가 사용한 클래스와 메서드가 무엇이 있는지 한 눈에 볼 수 있도록 해야할 필요성을 느꼈다.

2.

현재 구현한 방법은 객체지향적으로 구현한 것이 아니라, 단순히 분리된 클래스에서 기능을 수행하는 것으로 구현한 것으로 생각된다. 이에 코드를 엎고 객체지향적으로 코딩할 수 있도록 수정 중에 있다.

profile
공부노트

0개의 댓글