1. 장바구니 생성 및 관리 기능 추가 2. 장바구니 출력 및 금액 계산 3. 장바구니 담기 기능 4. 주문 기능
클래스 역할 정의
클래스
역할
Main
Kiosk 시작
Kiosk
키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스
Menu
MenuItem 클래스를 관리하는 클래스
MenuItem
개별 음식 항목을 관리하는 클래스(이름, 가격, 설명)
Cart
장바구니 항목을 관리하는 클래스(MenuItem, 수량)
2. 기능소개
장바구니 담기, 장바구니 출력 및 금액 계산, 장바구니에 담긴 항목 주문
1. 카테고리 선택(예시: 1번(burger)) 2. 메뉴 선택 후 장바구니 추가 선택(예시 1번(ShackBurger)선택 후 1번(추가)) 3. 장바구니 보기 선택(예시 4번(Orders)) 4. 주문하기 선택(예시 1번(주문)) 5. 주문 완료 확인
3. Cart클래스 생성
장바구니기능을 위해 Map으로 사용자가 선택한 메뉴아이템과 수량을 관리
public class Cart {
// Integer 수량
private Map<MenuItem, Integer> cartList;
public Cart() {};
public Cart(Map<MenuItem, Integer> cartList) {
this.cartList = cartList;
}
// getter
// setter
}
4. 트러블 슈팅
- Cart클래스 필드 설정 - TO-BE: - Cart클래스의 필드를 MenuItem과 같은 방향으로 설정하였다.
public class Cart {
private String name; // 메뉴명
private int quantity; // 수량
private double price; // 가격
}
- 그리고 Kiosk클래스에서 List<Cart>를 사용해 활용하려고 했다.
- AS-IS 1: - 문제점은 Cart클래스가 아닌 CartItem과 동일해졌다. - 튜터님께 물어본 결과 MenuItem객체를 가져와 Map의 키로 사용하고 밸류는 Integer으로 수량을 계산하도록 설정하였다.
private Map<MenuItem, Integer> cartList;
- AS-IS 2:
- 요구사항을 진행하다가 문제점이 생겼다.
- 아래처럼 키오스트에서 리스트로 Cart를 받았더니 계속 Cart를 생성하게 되었다.
class Kiosk() {
private List<Cart> cart;
}
- 그래서 코드가 길어짐과 동시에 한곳에 Cart를 쓰게 만들다보니 리스트로 받을 이유가 사라졌다. - 아래처럼 Cart객체만 생성하도록 설정하였다.
class Kiosk() {
private Cart cart = new Cart(new HashMap<>());
}
- 메서드 분리 - 요구사항에 메서드가 없기에 코드가 길어지더라도 메서드를 분리해서 관리하지 않았다. - 하지만 사용자에 입력을 받을때마다 동일한 코드가 지속되어 아래처럼 메서드를 분리하였다.
// 사용자의 입력값이 정수가 아니면 false를 반환하는 메서드
private static boolean checkInteger(Scanner sc) {
if (!sc.hasNextInt()) {
System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.\n");
sc.next();
return false;
}
return true;
}
4. 추후 리팩토링
- 마지막에 시간에 쫓겨 메인메뉴에서 장바구니가 추가될 때 생성되는 4번(Orders), 5번(Cancle) 기능을 하드코딩하였다.
...
} else if (categoryChoice==4) {
...
} else if (categoryChoice == 5) {
...
} else if (categoryChoice == 0) {
flag = false;
System.out.println("프로그램을 종료합니다.");
}
- 카테고리 메뉴가 추가되면 번호가 바뀔 것이기 때문에 래픽토링이 필요하다.
- 이전 과제에서 처음부터 패키지 분리, 메서드 분리를 생각하다보니 시간을 많이 뺐겼다. 그리고 정리가 되지 않으니 메서드의 위치나 이름을 변경하면서 필요없는 시간이 많이 발생하였다. - 일단 절차지향언어처럼 개발을 하였는데 도전과제를 진행하면서 코드가 길어지고 반복되는 메서드들이 명확히 보이기 시작했다.
클래스
역할
Main
Kiosk 시작
Kiosk
키오스크 프로그램의 메뉴와 장바구니를 관리
Menu
MenuItem 클래스를 관리하는 클래스
MenuItem
개별 음식 항목을 관리하는 클래스(이름, 가격, 설명)
Cart
장바구니 항목을 관리하는 클래스(MenuItem, 수량)
추가될 클래스
Input
사용자 입력을 처리하는 클래스
Output
사용자의 출력을 처리하는 클래스
MenuService
메뉴의 기능을 모아놓은 클래스
CartService
장바구니의 기능을 모아놓은 클래스
- 메서드를 분리시키고 공통점을 모아 클래스로 분리시키면 객체지향언어에 맞게 다가갈 수 있을 것 같다.