오늘은 Enum과 람다 & 스트림을 활용하여 키오스크를 개선하였습니다.
Main
package com.example.kiosk7;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
Menu burgermenu = new Menu("Burgers");
Menu drinkmenu = new Menu("Drinks");
Menu dessertmenu = new Menu("Desserts");
// add 함수를 통해 new shakeMenu(이름, 가격, 설명) List에 삽입
burgermenu.addMenuItem(new MenuItem("ShakeBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
burgermenu.addMenuItem(new MenuItem("SmokeShake", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
burgermenu.addMenuItem(new MenuItem("CheeseBurger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
burgermenu.addMenuItem(new MenuItem("HamBurger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
drinkmenu.addMenuItem(new MenuItem("Lemonade", 4.5, "매장에서 직접 만드는 상큼한 레몬에이드"));
drinkmenu.addMenuItem(new MenuItem("Fresh Brewed Iced Tea", 3.7, "직접 유기농 홍차를 우려낸 아이스 티"));
drinkmenu.addMenuItem(new MenuItem("Abita Root Beer", 5.0, "청량감 있는 독특한 미국식 무알콜 탄산음료"));
drinkmenu.addMenuItem(new MenuItem("Fountain Soda", 2.9, "코카콜라, 코카콜라 제로, 스프라이트, 환타 오렌지, 환타 그레이프, 환타 파인애플"));
dessertmenu.addMenuItem(new MenuItem("Classic Hand-Spun Shakes", 6.8, "쫀득하고 진한 커스터드가 들어간 클래식 쉐이크"));
dessertmenu.addMenuItem(new MenuItem("Floats", 6.8, "부드러운 바닐라 커스터드와 톡톡 터지는 탄산이 만나 탄생한 색다른 음료"));
dessertmenu.addMenuItem(new MenuItem("CONCRETES", 6.2, "쫀득하고 진한 맛의 커스터드와 다양한 믹스-인이 만나 탄생한 쉐이크쉑만의 디저트 메뉴"));
dessertmenu.addMenuItem(new MenuItem("Cup & Cones", 5.7, "매일 점포에서 신선하게 제조하는 쫀득하고 진한 아이스크림"));
List<Menu> menus = Arrays.asList(burgermenu, drinkmenu, dessertmenu);
Kiosk kiosk = new Kiosk(menus);
kiosk.start();
}
}
MenuItem
package com.example.kiosk7;
import java.util.List;
public class Cart {
private final MenuItem menuItem;
private int quantity;
public Cart(MenuItem menuItem, int quantity) {
this.menuItem = menuItem;
this.quantity = quantity;
}
public MenuItem getMenuItem() {
return menuItem;
}
public int getQuantity() {
return quantity;
}
public void addQuantity(int quantity) {
this.quantity += quantity;
}
public double getTotalPrice() {
return menuItem.getPrice() * quantity;
}
}
Cart
package com.example.kiosk7;
public class Cart {
private final MenuItem menuItem;
private int quantity;
public Cart(MenuItem menuItem, int quantity) {
this.menuItem = menuItem;
this.quantity = quantity;
}
public MenuItem getMenuItem() {
return menuItem;
}
public int getQuantity() {
return quantity;
}
public void addQuantity(int quantity) {
this.quantity += quantity;
}
public double getTotalPrice() {
return menuItem.getPrice() * quantity;
}
}
Kiosk
package com.example.kiosk7;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Kiosk {
private final List<Cart> carts;
private final List<Menu> menus;
private final Scanner scanner;
CustomerType soldier = CustomerType.SOLDIER;
CustomerType student = CustomerType.STUDENT;
CustomerType ordinary = CustomerType.ORDINARY;
CustomerType crew = CustomerType.CREW;
public Kiosk(List<Menu> menus) {
this.carts = new ArrayList<>();
this.menus = menus;
this.scanner = new Scanner(System.in);
}
public void start() {
boolean running = true;
while (running) {
try {
showMainMenu(); // 메인메뉴 호출
System.out.println();
int choice = scanner.nextInt(); // 카테고리 선택
System.out.println();
// 입력받은 숫자를 토대로 어떤 작업을 수행할지 if 문으로 판단
if (choice == 0) {
running = false;
continue;
}
if (choice < 0 || choice > menus.size()) {
throw new IllegalArgumentException("잘못된 메뉴 번호입니다.");
}
if (choice >= 1 && choice <= menus.size()) {
Menu selectedMenu = menus.get(choice - 1);
selectedMenu.showMenu();
int menuChoice = scanner.nextInt();
if (menuChoice == 0) continue;
if (menuChoice < 0 || menuChoice > selectedMenu.getMenuItems().size()) {
throw new IllegalArgumentException("잘못된 메뉴 항목 번호입니다.");
}
// 선택한 메뉴를 보여줌
MenuItem selectedItem = selectedMenu.getMenuItems().get(menuChoice - 1);
System.out.println();
System.out.printf("선택한 메뉴: %-15s | W%-4.1f | %s%n", selectedItem.getName(), selectedItem.getPrice(), selectedItem.getDescribe());
System.out.println();
System.out.println("위 메뉴를 장바구니에 추가하시겠습니까?");
System.out.println("1. 확인 2. 취소");
// 메뉴를 장바구니에 추가 할지 입력받고 그 값에 따라 수행
int inCart = scanner.nextInt();
if (inCart == 2)
continue;
else if (inCart != 1)
throw new IllegalArgumentException("잘못된 입력입니다.");
// 수량 입력 및 오류 출력
System.out.println();
System.out.println("수량을 입력하세요: ");
int quantity = scanner.nextInt();
if (quantity <= 0) {
throw new IllegalArgumentException("수량은 1개 이상이어야 합니다.");
}
addToCart(selectedItem, quantity);
System.out.println();
System.out.println(selectedItem.getName() + " " + quantity + "개가 장바구니에 추가되었습니다.");
System.out.println();
// 장바구니에 메뉴가 있으면 Order 출력
if (!carts.isEmpty()) {
System.out.println("[ ORDER MENU ]");
System.out.println();
System.out.println("4. Orders");
System.out.println("5. Cancel");
int orderDecision = scanner.nextInt();
if (orderDecision == 4) {
System.out.println();
System.out.println("아래와 같이 주문하시겠습니까?");
System.out.println();
showCart();
System.out.println();
totalPrice();
System.out.println();
System.out.println("1. 주문 2. 메뉴판");
System.out.println();
// 메뉴를 더 추가할지 아니면 이대로 주문할지 입력 받음
int finalDecision = scanner.nextInt();
if (finalDecision == 1) {
// 할인정보 입력 받음
System.out.println();
System.out.println("할인 정보를 입력해주세요.");
System.out.println();
System.out.println("1. 일반인 2. 군인 3. 학생 4. 직원");
int cType = scanner.nextInt();
System.out.println();
double totalPrice = 0;
double discountPrice = 0;
for (Cart item : carts) {
MenuItem menuItem = item.getMenuItem();
totalPrice += item.getTotalPrice();
}
System.out.println("금액은 W " + totalPrice + " 입니다.");
System.out.println();
switch (cType) {
case 1:
System.out.println(ordinary.getCustomerType() + "은 할인이 없습니다.");
break;
case 2:
System.out.println(soldier.getCustomerType() + "은 할인이 5% 됩니다.");
discountPrice = totalPrice - (totalPrice * 0.05);
System.out.println("할인 후 금액은 W " + discountPrice + " 입니다.");
break;
case 3:
System.out.println(student.getCustomerType() + "은 할인이 3% 됩니다.");
discountPrice = totalPrice - (totalPrice * 0.03);
System.out.println("할인 후 금액은 W " + discountPrice + " 입니다.");
break;
case 4:
System.out.println(crew.getCustomerType() + "은 할인이 10% 됩니다.");
discountPrice = totalPrice - (totalPrice * 0.1);
System.out.println("할인 후 금액은 W " + discountPrice + " 입니다.");
break;
}
System.out.println();
System.out.println("주문이 완료 되었습니다!");
System.out.println();
carts.clear();
continue;
} else if (finalDecision == 2) {
continue;
} else
throw new IllegalArgumentException("잘못된 입력입니다.");
} else if (orderDecision == 5) {
System.out.println("주문을 취소합니다.");
continue;
} else
throw new IllegalArgumentException("잘못된 입력입니다.");
}
}
} catch (IllegalArgumentException e) {
System.out.println("오류: " + e.getMessage());
scanner.nextLine(); // 입력 버퍼 비우기
} catch (Exception e) {
System.out.println("잘못된 입력입니다. 다시 시도해주세요.");
scanner.nextLine(); // 입력 버퍼 비우기
}
}
}
private void showMainMenu() {
System.out.println("[ MAIN MENU ]");
for (int i = 0; i < menus.size(); i++) {
System.out.printf("%-2d. %-10s%n", (i + 1), menus.get(i).getName());
}
System.out.printf("%-2d. %-10s | %s%n", 0, "종료", "종료");
}
private void addToCart(MenuItem item, int quantity) {
for (Cart cartItem : carts) {
if (cartItem.getMenuItem().getName().equals(item.getName())) {
cartItem.addQuantity(quantity);
return;
}
}
carts.add(new Cart(item, quantity));
}
private void showCart() {
System.out.println("\n[ 장바구니 ]");
carts.stream()
.forEach(item -> System.out.printf("%-15s | W%-4.1f | %s - %d개%n",
item.getMenuItem().getName(),
item.getMenuItem().getPrice(),
item.getMenuItem().getDescribe(),
item.getQuantity()));
}
private void totalPrice() {
System.out.println("[ TOTAL ]");
double totalPrice = carts.stream()
.mapToDouble(Cart::getTotalPrice)
.sum();
System.out.printf("W%.1f%n", totalPrice);
System.out.println();
}
}
Menu
package com.example.kiosk7;
import java.util.ArrayList;
import java.util.List;
public class Menu {
private final String name;
private final List<MenuItem> menuItems;
public Menu(String name) {
this.name = name;
this.menuItems = new ArrayList<>();
}
public void addMenuItem(MenuItem item) {
menuItems.add(item);
}
public String getName() {
return name;
}
public List<MenuItem> getMenuItems() {
return menuItems;
}
public void showMenu() {
System.out.println("[ " + name + " MENU ]");
menuItems.stream()
.forEach(menuItem -> System.out.printf("%-2d. %-15s | W%-4.1f | %s%n",
menuItems.indexOf(menuItem) + 1,
menuItem.getName(),
menuItem.getPrice(),
menuItem.getDescribe()));
System.out.printf("%-2d. %-10s | %s%n", 0, "종료", "종료");
}
}
CustomerType
package com.example.kiosk7;
public enum CustomerType {
SOLDIER("군인"),
STUDENT("학생"),
ORDINARY("일반인"),
CREW("직원");
private String customerType;
private CustomerType(String customerType) {
this.customerType = customerType;
}
public String getCustomerType() {
return customerType;
}
}
Enum을 넣음으로서 상수를 안전하게 관리하며 프로그램 구조를 조금 더 간결하게 만들었습니다.
또한 Enum에 사용자 유형을 지정하여 사용자 유형에 따라 각각 다른 할인율이 적용될 수 있게 만들었습니다.
람다와 스트림을 통해 데이터를 필터링하고, 간결한 코드로 동작을 구현할 수 있게 되었습니다.
ReadMe
Kiosk
클래스를 적용해 주문을 수행할 수 있는 키오스크 만들기
간단한 콘솔 기반 키오스크 애플리케이션으로, 사용자 입력을 통해 주문을 수행합니다.
주요 기능
메뉴 관리 및 표시
버거, 음료, 디저트 메뉴 카테고리 제공
스트림을 활용한 메뉴 항목 표시
각 메뉴의 이름, 가격, 설명 정보 제공
장바구니 기능
선택한 메뉴 장바구니 추가
스트림을 활용한 장바구니 내역 조회
장바구니 총액 계산
할인 시스템
고객 유형별 차등 할인율 적용
군인: 5% 할인
학생: 3% 할인
직원: 10% 할인
일반: 할인 없음
구현 사항
입력 처리
Scanner 클래스를 사용하여 사용자 입력을 받음
잘못된 입력에 대해서는 예외 처리를 통해 적절한 오류 메시지를 출력
입력 버퍼를 비워 연속적인 입력 오류를 방지
메뉴 처리
메인 메뉴에서는 버거, 음료, 디저트 카테고리를 표시
각 카테고리 선택 시 세부 메뉴 항목을 보여줌
메뉴 선택 시 해당 메뉴의 이름, 가격, 설명을 표시
사용자는 메뉴를 장바구니에 추가 또는 추가하기 전 취소
장바구니 관리
장바구니에는 선택한 메뉴 항목과 수량이 저장
동일 메뉴 선택 시 수량이 자동으로 증가
스트림 API를 활용하여 장바구니 내역을 조회하고 총액을 계산
주문 완료 시 장바구니는 자동으로 비워짐
취소 시에도 메인 메뉴로 돌아감
while 루프를 사용한 연속 주문을 지원하며
사용자가 0을 입력할 때까지 주문을 반복합니다.
사용 방법
1. 메인 메뉴에서 카테고리 선택
2. 세부 메뉴 선택
3. 수량 입력
4. 장바구니 확인 및 주문 결정
5. 고객 유형 선택 및 할인 적용
6. 최종 결제 또는 취소
제한사항
메뉴 가격은 소수점 첫째 자리까지만 표시
장바구니가 비어있을 때는 주문 불가
이렇게 키오스크를 완성하였습니다!!
'TIL' 카테고리의 다른 글
스프링 프레임워크 기본 개념 (0) | 2025.01.22 |
---|---|
오늘 배운 것 (0) | 2025.01.21 |
[키오스크 만들기] 키오스크 만들기 3일차 (0) | 2025.01.17 |
[키오스크 만들기] 키오스크 만들기 2일차 (3) | 2025.01.16 |
[스타크래프트 게임 출력] 2일차 (1) | 2025.01.15 |