미니 프로젝트 세트 6 모범답안: 카페 주문 관리자
완성 프로그램
import java.util.ArrayList;
import java.util.HashMap;
class CafeOrder {
private String customerName;
private HashMap<String, Double> menu;
private ArrayList<String> itemNames;
private double discountPercent;
public CafeOrder(String customerName) {
this.customerName = customerName;
this.menu = new HashMap<>();
this.itemNames = new ArrayList<>();
this.discountPercent = 0.0;
}
public void addMenuItem(String itemName, double price) {
menu.put(itemName, price);
}
public void addItem(String itemName) {
if (menu.containsKey(itemName)) {
itemNames.add(itemName);
}
}
public void applyDiscount(double percent) {
if (percent > 0 && percent < 100) {
discountPercent = percent;
}
}
public int itemCount() {
return itemNames.size();
}
public double totalSpent() {
double total = 0.0;
for (String name : itemNames) {
total += menu.get(name);
}
return total * (100.0 - discountPercent) / 100.0;
}
public double averageItemPrice() {
if (itemCount() == 0) {
return 0.0;
}
return totalSpent() / itemCount();
}
public boolean qualifiesForLoyalty() {
return itemCount() >= 4 && totalSpent() >= 20.0;
}
public String getSummary() {
return customerName + ": " + itemCount() + " items, $"
+ String.format("%.2f", totalSpent()) + " total";
}
}
public class Main {
public static void main(String[] args) {
CafeOrder order = new CafeOrder("Mina");
order.addMenuItem("Americano", 5.50);
order.addMenuItem("Sandwich", 8.00);
order.addMenuItem("Cake", 12.00);
order.addMenuItem("Water", 1.00);
order.addItem("Americano");
order.addItem("Sandwich");
order.addItem("Unknown Item");
order.addItem("Cake");
order.addItem("Water");
order.applyDiscount(10.0);
System.out.printf("%.2f%n", order.averageItemPrice());
System.out.println(order.qualifiesForLoyalty());
System.out.println(order.getSummary());
}
}
출력
5.96
true
Mina: 4 items, $23.85 total
핵심 포인트
- 생성자가 두 컬렉션을 초기화해 모든 메서드가 바로 사용할 수 있게 한다.
containsKey 검사로 없는 항목이 주문에 추가되지 않는다.
totalSpent()는 메뉴 맵에서 각 가격을 조회한 뒤 할인을 적용한다.
averageItemPrice()는 나누기 전에 항목 수를 확인해 0으로 나누지 않는다.
qualifiesForLoyalty()는 &&가 필요하다. 두 요구 조건 중 하나만 충족하면 충분하지 않다.
String.format("%.2f", totalSpent())가 총액을 소수점 둘째 자리로 고정한다.