-
요구사항이 가지는 의도
- 입력 처리와 간단한 흐름 제어를 복습합니다. (프로그래밍 검증**)**
-
Scanner활용법, 조건문, 반복문을 재확인하며 입력 데이터를 처리하는 방법 강화
-
햄버거 메뉴 출력 및 선택하기
- 실행시 햄버거 메뉴가 표시되고, 이후 Scanner로 숫자를 입력받아서 메뉴를 선택할 수 있다.
- 제시된 메뉴 중 입력받은 숫자에 따라 다른 로직을 실행하는 코드를 작성합니다.
- 반복문을 이용해서 특정 번호가 입력되면 프로그램을 종료합니다
Lv1을 구현하면 터미널에 이렇게 보여집니다.
[ SHAKESHACK MENU ]
1. ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
2. SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
3. Cheeseburger | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거
4. Hamburger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거
0. 종료 | 종료
0 <- // 0을 입력
프로그램을 종료합니다.
-
MenuItem클래스 생성하기- 설명 : 개별 음식 항목을 관리하는 클래스입니다. 현재는 햄버거만 관리합니다.
- 클래스는
이름,가격,설명필드를 갖습니다.
-
main함수에서MenuItem클래스를 활용하여 햄버거 메뉴를 출력합니다.-
MenuItem객체 생성을 통해이름,가격,설명을 세팅합니다.- 키워드:
new
- 키워드:
-
List를 선언하여 여러MenuItem을 추가합니다.-
List<MenuItem> menuItems = new ArrayList<>();
-
- 반복문을 활용해
menuItems를 탐색하면서 하나씩 접근합니다.
-
-
Lv2 의 구조 예시.
public static void main(String[] args) {
// List 선언 및 초기화
// add 함수를 통해 new MenuItem(이름, 가격, 설명) List에 삽입
// Scanner 선언
// 반복문을 활용해 List 안에 있는 MenuItem을 하나씩 출력
// 숫자를 입력 받기
// 입력된 숫자에 따른 처리
// 프로그램을 종료
// 선택한 메뉴 : 이름, 가격, 설명
}
-
요구사항이 가지는 의도
- 객체 지향 개념을 학습하고, 데이터를 구조적으로 관리하며 프로그램을 설계하는 방법을 익힙니다.
-
main함수에서 관리하던 전체 순서 제어를Kiosk클래스를 통해 관리합니다.
-
Kiosk클래스 생성하기- 설명: 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스입니다.
-
MenuItem을 관리하는 리스트가 필드로 존재합니다. -
main함수에서 관리하던 입력과 반복문 로직은 이제start함수를 만들어 관리합니다. -
List<MenuItem> menuItems는Kiosk클래스 생성자를 통해 값을 할당합니다.-
Kiosk객체를 생성하고 사용하는main함수에서 객체를 생성할 때 값을 넘겨줍니다.
-
-
요구사항에 부합하는지 검토
- 키오스크 프로그램을 시작하는 메서드가 구현되어야 합니다.
- 콘솔에 햄버거 메뉴를 출력합니다.
- 사용자의 입력을 받아 메뉴를 선택하거나 프로그램을 종료합니다.
- 유효하지 않은 입력에 대해 오류 메시지를 출력합니다.
-
0을 입력하면 프로그램이 ‘뒤로가기’되거나 ‘종료’됩니다.
- 키오스크 프로그램을 시작하는 메서드가 구현되어야 합니다.
-
Menu클래스 생성하기- 설명 : MenuItem 클래스를 관리하는 클래스입니다.
예를 들어, 버거 메뉴, 음료 메뉴 등 각 카테고리 내에 여러
MenuItem을 포함합니다. -
List<MenuItem>은Kiosk클래스가 관리하기에 적절하지 않으므로 Menu 클래스가 관리하도록 변경합니다. - 여러 버거들을 포함하는 상위 개념 ‘버거’ 같은
카테고리 이름필드를 갖습니다. - 메뉴 카테고리 이름을 반환하는 메서드가 구현되어야 합니다.
- 설명 : MenuItem 클래스를 관리하는 클래스입니다.
예를 들어, 버거 메뉴, 음료 메뉴 등 각 카테고리 내에 여러
-
구조 예시
public static void main(String[] args) {
// Menu 객체 생성하면서 카테고리 이름 설정
// Menu 클래스 내 있는 List<MenuItem> 에 MenuItem 객체 생성하면서 삽입
// Kiosk 객체 생성
// Kiosk 내 시작하는 함수 호출
}
public class Kiosk {
start() {
// 스캐너 선언
// 반복문 시작
// List와 Menu 클래스 활용하여 상위 카테고리 메뉴 출력
// 숫자 입력 받기
// 입력 받은 숫자가 올바르다면 인덱스로 활용하여 List에 접근하기
// List<Menu>에 인덱스로 접근하면 Menu만 추출할 수 있겠죠?
// Menu가 가진 List<MenuItem>을 반복문을 활용하여 햄버거 메뉴 출력
// 숫자 입력 받기
// 입력 받은 숫자가 올바르다면 인덱스로 활용해서 Menu가 가지고 있는 List<MenuItem>에 접근하기
// menu.getMenuItems().get(i); 같은 형식으로 하나씩 들어가서 얻어와야 합니다.
}
}
public class Menu {
// 카테고리 이름 필드 추가
// MenuItem 클래스를 List로 관리
// List에 포함된 MenuItem을 순차적으로 보여주는 함수
// List를 리턴하는 함수
// 구조에 맞게 함수를 선언해놓고 가져다 사용하세요.
}
public class MenuItem {
// 이름, 가격, 설명 필드 선언하여 관리
// 구조에 맞게 함수를 선언해놓고 가져다 사용하세요.
}
- Lv.4 터미널 출력 시:
[ MAIN MENU ]
1. Burgers
2. Drinks
3. Desserts
0. 종료 | 종료
1 <- // 1을 입력
[ BURGERS MENU ]
1. ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
2. SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
3. Cheeseburger | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거
4. Hamburger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거
0. 뒤로가기
2 <- // 2를 입력
선택한 메뉴: SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
[ MAIN MENU ]
1. Burgers
2. Drinks
3. Desserts
0. 종료 | 종료
0 <- // 0을 입력
프로그램을 종료합니다.
-
MenuItem,Menu그리고Kiosk클래스의 필드에 직접 접근하지 못하도록 설정합니다. - Getter와 Setter 메서드를 사용해 데이터를 관리합니다.
-
KioskChallenge1, KioskChallenge2 패키지.
-
요구사항이 가지는 의도
- 의도: 클래스 간 연계를 통해 객체 지향 프로그래밍의 기본적인 설계를 익히고, 사용자 입력에 따른 프로그램 흐름 제어와 상태 관리를 학습
- 목표
- 클래스 간 역할 분리를 이해하고, 적절히 협력하는 객체를 설계
- 프로그램 상태 변경 및 데이터 저장을 연습
- 사용자 입력에 따른 예외 처리와 조건 분기를 연습
- 장바구니 생성 및 관리 기능
- 사용자가 선택한 메뉴를 장바구니에 추가할 수 있는 기능을 제공합니다.
- 장바구니는 메뉴명, 수량, 가격 정보를 저장하며, 항목을 동적으로 추가 및 조회할 수 있어야 합니다.
- 사용자가 잘못된 선택을 했을 경우 예외를 처리합니다(예: 유효하지 않은 메뉴 번호 입력)
- 장바구니 출력 및 금액 계산
- 사용자가 결제를 시도하기 전에, 장바구니에 담긴 모든 메뉴와 총 금액을 출력합니다.
- 출력 예시
- 각 메뉴의 이름, 가격, 수량
- 총 금액 합계
- 장바구니 담기 기능
- 메뉴를 클릭하면 장바구니에 추가할 지 물어보고, 입력값에 따라 “추가”, “취소” 처리합니다.
- 메뉴는 한 번에 1개만 담을 수 있습니다.
- 장바구니에 담은 목록을 출력합니다.
- 메뉴를 클릭하면 장바구니에 추가할 지 물어보고, 입력값에 따라 “추가”, “취소” 처리합니다.
- 주문 기능
- 장바구니에 담긴 모든 항목을 출력합니다.
- 합산하여 총 금액을 계산하고, “주문하기”를 누르면 장바구니를 초기화합니다.
- 구현 예시:
[ MAIN MENU ]
1. Burgers
2. Drinks
3. Desserts
0. 종료 | 종료
1 <- // 1을 입력
[ BURGERS MENU ]
1. ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
2. SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
3. Cheeseburger | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거
4. Hamburger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거
0. 뒤로가기
2 <- // 2를 입력
선택한 메뉴: SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
// 2번을 누르면 나오는 메뉴입니다.
"SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"
위 메뉴를 장바구니에 추가하시겠습니까?
1. 확인 2. 취소
1 <-
// 1번을 누르면 나오는 메뉴입니다.
SmokeShack 이 장바구니에 추가되었습니다.
// 장바구니에 물건이 들어 있으면 아래와 같이 [ ORDER MENU ] 가 추가로 출력됩니다.
// 만약에 장바구니에 물건이 들어 있지 않다면 [ ORDER MENU ] 가 출력되지 않습니다.
// 미출력일 때 4,5 번을 누르면 예외를 던저줘야 합니다.
아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.
[ MAIN MENU ]
1. Burgers
2. Drinks
3. Desserts
0. 종료 | 종료
[ ORDER MENU ]
4. Orders | 장바구니를 확인 후 주문합니다.
5. Cancel | 진행중인 주문을 취소합니다.
4 <- // 4를 입력
// 4번을 누르면 나오는 메뉴입니다.
아래와 같이 주문 하시겠습니까?
[ Orders ]
SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
[ Total ]
W 8.9
1. 주문 2. 메뉴판
1 <-
// 1번을 누르면 나오는 메뉴입니다.
주문이 완료되었습니다. 금액은 W 8.9 입니다.
- 요구사항이 가지는 의도
- 의도 : 고급 자바 기능을 활용해 프로그램의 효율성과 코드의 가독성을 개선하는 것을 목표로 합니다.
- 목적
- Enum을 통해 상수를 안전하게 관리하고, 프로그램 구조를 간결하게
- 제네릭을 활용하여 데이터 유연성을 높이고, 재사용 가능한 코드를 설계
- 스트림 API를 사용하여 데이터를 필터링하고, 간결한 코드로 동작을 구현
- Enum을 활용한 사용자 유형별 할인율 관리하기
- 사용자 유형의 Enum 정의 및 각 사용자 유형에 따른 할인율 적용
- 예시 : 군인, 학생, 일반인
- 주문 시, 사용자 유형에 맞는 할인율 적용해 총 금액 계산
- 사용자 유형의 Enum 정의 및 각 사용자 유형에 따른 할인율 적용
- 람다 & 스트림을 활용한 장바구니 조회 기능
- 기존에 생성한 Menu의 MenuItem을 조회 할 때 스트림을 사용하여 출력하도록 수정
- 기존 장바구니에서 특정 메뉴 빼기 기능을 통한 스트림 활용
- 예시 : 장바구니에 SmokeShack 가 들어 있다면, stream.filter를 활용하여 특정 메뉴 이름을 가진 메뉴 장바구니에서 제거
- 구조 예시
[ MAIN MENU ]
1. Burgers
2. Drinks
3. Desserts
0. 종료 | 종료
1 <- // 1을 입력
[ BURGERS MENU ]
1. ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
2. SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
3. Cheeseburger | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거
4. Hamburger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거
0. 뒤로가기
2 <- // 2를 입력
선택한 메뉴: SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
// 2번을 누르면 나오는 메뉴입니다.
"SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"
위 메뉴를 장바구니에 추가하시겠습니까?
1. 확인 2. 취소
1 <-
// 1번을 누르면 나오는 메뉴입니다.
SmokeShack 이 장바구니에 추가되었습니다.
// 장바구니에 물건이 들어 있으면 아래와 같이 [ ORDER MENU ] 가 추가로 출력됩니다.
// 만약에 장바구니에 물건이 들어 있지 않다면 [ ORDER MENU ] 가 출력되지 않습니다.
// 미출력일 때 4,5 번을 누르면 예외를 던저줘야 합니다.
아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.
[ MAIN MENU ]
1. Burgers
2. Drinks
3. Desserts
0. 종료 | 종료
[ ORDER MENU ]
4. Orders | 장바구니를 확인 후 주문합니다.
5. Cancel | 진행중인 주문을 취소합니다.
4 <- // 4를 입력
// 4번을 누르면 나오는 메뉴입니다.
아래와 같이 주문 하시겠습니까?
[ Orders ]
SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
[ Total ]
W 8.9
1. 주문 2. 메뉴판
1 <-
// 1번을 누르면 할인 정보를 제공해줍니다.
할인 정보를 입력해주세요.
1. 국가유공자 : 10%
2. 군인 : 5%
3. 학생 : 3%
4. 일반 : 0%
4 <-
// 4번을 누르면 나오는 메뉴입니다.
주문이 완료되었습니다. 금액은 W 8.9 입니다.
-
✅클래스 설명
-
1. Menu 클래스
-
기능: 메뉴 카테고리와 해당 카테고리의 메뉴 아이템을 관리.
-
메서드:
-
addMenuItem(MenuItem item): 메뉴 아이템을 추가.
-
displayMenuItems(): 메뉴 아이템을 출력.
-
-
-
2. MenuItem 클래스
-
기능: 메뉴 아이템의 이름, 가격, 설명을 저장.
-
메서드:
- getName(), getPrice(), getDescription(): 각 속성에 접근.
-
-
3. ShoppingList 클래스
-
기능: 장바구니에 추가된 메뉴 아이템의 수량을 관리.
-
메서드:
-
setCount(int count): 수량을 설정.
-
getCount(): 수량을 반환.
-
-
-
4. ShoppingCart 클래스
-
기능: 장바구니에 추가된 항목을 관리.
-
메서드:
-
addShoppingList(ShoppingList list): 장바구니에 항목을 추가.
-
displayShoppingLists(): 장바구니의 항목을 출력.
-
calculatorTotal(): 총 금액을 계산.
-
clearShoppinglist(): 장바구니를 초기화.
-
-
-
5. Kiosk 클래스
-
기능: 키오스크 프로그램의 메인 로직을 담당.
-
메서드:
-
start(): 프로그램을 시작하고 사용자와 상호작용.
-
메뉴 선택, 장바구니 추가, 주문 및 결제 기능을 제공.
-
-
-
6. Discount Enum
-
기능: 사용자 유형에 따른 할인율을 정의.
-
값: Veteran, Soldier, Student, Normal.
-
-
✅주요 기능
-
메뉴 관리: 여러 카테고리의 메뉴를 제공합니다.
-
장바구니 관리: 사용자가 선택한 메뉴를 장바구니에 추가하고, 수량을 관리합니다.
-
할인 및 결제: 사용자 유형에 따른 할인율을 적용하고, 결제 기능을 제공합니다.
-
취소 기능: 장바구니 항목을 취소할 수 있습니다.
취소할 항목에서 번호가 없다. 현재
-
[ Cancel Menu ]
ShackBurger | W 6.9 | 수량: 2
HamBurger | W 5.7 | 수량: 1
취소할 항목의 번호를 입력하세요 (0: 취소):
원하는 변경
[ Cancel Menu ]
1. ShackBurger | W 6.9 | 수량: 2
2. HamBurger | W 5.7 | 수량: 1
취소할 항목의 번호를 입력하세요 (0: 취소):
처럼 앞에 번호를 달아주고 싶다.