콘텐츠로 이동

미니 프로젝트 세트 6: 카페 주문 관리자

이름: ________

시간: 40분

카페에서 고객의 주문을 관리하는 작은 Java 프로그램을 작성하세요. CafeOrder 클래스는 메뉴를 HashMap에, 주문 항목을 ArrayList에 저장합니다. 클래스를 완성한 다음 Main으로 테스트합니다.

학습 목표

  • 생성자에서 컬렉션과 인스턴스 변수를 초기화한다.
  • HashMap으로 항목 이름에 해당하는 가격을 조회한다.
  • 항목 이름을 ArrayList에 저장한다.
  • 잘못된 입력과 없는 항목을 거부한다.
  • 인스턴스 메서드에서 double, boolean, String 값을 반환한다.

프로그램 규칙

  • 생성자는 고객 이름을 받는다. 빈 HashMap<String, Double> menu, 빈 ArrayList<String> itemNames를 만들고 할인을 0.0으로 설정한다.
  • addMenuItem(String itemName, double price)menu에 항목 이름으로 가격을 저장한다.
  • addItem(String itemName)containsKey로 항목이 menu에 있을 때만 itemNames에 추가한다.
  • applyDiscount(double percent)percent0보다 크고 100보다 작을 때만 할인율을 저장한다.
  • itemCount()는 주문한 항목 수를 반환한다.
  • totalSpent()는 주문한 모든 항목의 메뉴 가격을 더한 뒤 할인을 적용한다.
  • averageItemPrice()는 주문이 없으면 0.0을 반환하고, 그렇지 않으면 총액을 항목 수로 나눈 값을 반환한다.
  • qualifiesForLoyalty()itemCount()4 이상 이고 totalSpent()20.0 이상일 때 true를 반환한다.
  • getSummary()는 다음 형식의 문장을 정확히 반환한다. Mina: 4 items, $23.85 total 총액은 소수점 둘째 자리까지 표시한다.
  • 메서드 헤더와 Main의 코드를 바꾸지 않는다.

시작 코드

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) {
        // TODO
    }

    public void addMenuItem(String itemName, double price) {
        // TODO
    }

    public void addItem(String itemName) {
        // TODO
    }

    public void applyDiscount(double percent) {
        // TODO
    }

    public int itemCount() {
        // TODO
        return 0;
    }

    public double totalSpent() {
        // TODO
        return 0.0;
    }

    public double averageItemPrice() {
        // TODO
        return 0.0;
    }

    public boolean qualifiesForLoyalty() {
        // TODO
        return false;
    }

    public String getSummary() {
        // TODO
        return "";
    }
}

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

제출 전 확인

  • 생성자에서 두 컬렉션을 포함한 모든 필드를 초기화한다.
  • addItem에서 menu.containsKey(itemName)을 사용해 없는 항목을 무시한다.
  • totalSpent()에서 menu.get(name)으로 주문 항목의 가격을 조회한다.
  • averageItemPrice()에서 나누기 전에 itemCount()0보다 큰지 확인한다.
  • qualifiesForLoyalty()&&가 필요하다. 두 조건 중 하나만 충족하면 충분하지 않다.
  • getSummary() 안에서 String.format("%.2f", totalSpent())를 사용한다.