키오스크 만들기
- 메뉴판을 보고 주문
- 화면 심플하게 출력
- 메뉴 클래스와 주문 클래스 사용하여 Java 상속 최대한 사용하기
필요 기능
메인 메뉴판 화면 메뉴카테고리 (버거류, 음료류 등), 주문하기/취소하기
상품 메뉴판 화면 선택한 카테고리의 메뉴.
상품 선택 시 장바구니 추가 확인 문구
3-1. 확인 시 1번화면으로 이동. 장바구니에 메뉴 추가
3-2. 취소 시 2번화면으로 복귀
5.order
입력 시 현재 장바구니 목록을 출력
4-1. 추가된 메뉴들과 총 가격 합을 출력
4-2.1.주문
입력 시 주문완료화면으로 이동,2. 메뉴판
입력 시 메인메뉴로 복귀5.주문완료 및 대기번호 발급
설계 필수 사항
메뉴 클래스 : 이름, 설명 필드를 가지는 클래스(카테고리)
상품 클래스 : 이름, 가격, 설명 필드를 가지는 클래스 - 메뉴클래스 상속받기
주문 클래스 : 상품 객체를 담기선택 요구사항
- 장바구니에 담긴 상품은 주문화면에서 갯수가 출력되도록 하기
- 상품에 옵션 선택 후, 사이즈 추가하기
5.order
입력 시 현재 장바구니 목록 출력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
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
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
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.주문
선택 시 대기번호 출력 및 종료
오후에 팀원들과 자신의 코드를 리뷰하는 시간을 가졌는데, 나의 긴 코드를 말로 설명하려다 보니 설명이 장황해져 이해하기 어려운 코드리뷰가 되었다.
다이어그램을 작성하여, 먼저 내가 사용한 클래스와 메서드가 무엇이 있는지 한 눈에 볼 수 있도록 해야할 필요성을 느꼈다.
현재 구현한 방법은 객체지향적으로 구현한 것이 아니라, 단순히 분리된 클래스에서 기능을 수행하는 것으로 구현한 것으로 생각된다. 이에 코드를 엎고 객체지향적으로 코딩할 수 있도록 수정 중에 있다.