콘텐츠로 이동

미니 프로젝트 세트 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())가 총액을 소수점 둘째 자리로 고정한다.