스파르타 코딩클럽_내일 배움 캠프 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 작성하고 불러오는게 익숙하지 않지만, 더 많이 연습해서 피드백 받은대로 좀 더 깔끔한 코드를 작성할 수 있도록 노력해야겠다.
'🏕️내일배움캠프 > 📂키오스크 시스템 만들기(23.05.26)' 카테고리의 다른 글
키오스크 refactoring (0) | 2023.12.27 |
---|