Skip to content

Kimyoonbeom/projectKiosk

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

✅키오스크 과제 필수 과제 Lv 1 ~ 5, 도전 과제 Lv 1 ~ 2.

✅필수 과제 Lv1. 기본적인 키오스크

  • 요구사항이 가지는 의도

    • 입력 처리와 간단한 흐름 제어를 복습합니다. (프로그래밍 검증**)**
    • 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을 입력

프로그램을 종료합니다.

✅필수 과제 Lv2. 객체 지향 설계를 적용해 햄버거 메뉴를 클래스로 관리하기

  • 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을 하나씩 출력
		// 숫자를 입력 받기
		// 입력된 숫자에 따른 처리
			// 프로그램을 종료
			// 선택한 메뉴 : 이름, 가격, 설명
}

✅Lv 3. 객체 지향 설계를 적용해 순서 제어를 클래스로 관리하기

  • 요구사항이 가지는 의도

    • 객체 지향 개념을 학습하고, 데이터를 구조적으로 관리하며 프로그램을 설계하는 방법을 익힙니다.
    • main 함수에서 관리하던 전체 순서 제어를 Kiosk 클래스를 통해 관리합니다.
  • Kiosk 클래스 생성하기

    • 설명: 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스입니다.
    • MenuItem을 관리하는 리스트가 필드로 존재합니다.
    • main 함수에서 관리하던 입력과 반복문 로직은 이제 start 함수를 만들어 관리합니다.
    • List<MenuItem> menuItemsKiosk 클래스 생성자를 통해 값을 할당합니다.
      • Kiosk 객체를 생성하고 사용하는 main 함수에서 객체를 생성할 때 값을 넘겨줍니다.
  • 요구사항에 부합하는지 검토

    • 키오스크 프로그램을 시작하는 메서드가 구현되어야 합니다.
      • 콘솔에 햄버거 메뉴를 출력합니다.
      • 사용자의 입력을 받아 메뉴를 선택하거나 프로그램을 종료합니다.
      • 유효하지 않은 입력에 대해 오류 메시지를 출력합니다.
      • 0을 입력하면 프로그램이 ‘뒤로가기’되거나 ‘종료’됩니다.

    ✅Lv 4. 객체 지향 설계를 적용해 음식 메뉴와 주문 내역을 클래스 기반으로 관리하기

  • Menu 클래스 생성하기

    • 설명 : MenuItem 클래스를 관리하는 클래스입니다. 예를 들어, 버거 메뉴, 음료 메뉴 등 각 카테고리 내에 여러 MenuItem을 포함합니다.
    • List<MenuItem>Kiosk 클래스가 관리하기에 적절하지 않으므로 Menu 클래스가 관리하도록 변경합니다.
    • 여러 버거들을 포함하는 상위 개념 ‘버거’ 같은 카테고리 이름 필드를 갖습니다.
    • 메뉴 카테고리 이름을 반환하는 메서드가 구현되어야 합니다.
  • 구조 예시

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을 입력
프로그램을 종료합니다.

✅Lv 5. 캡슐화 적용하기

  • MenuItem, Menu 그리고 Kiosk 클래스의 필드에 직접 접근하지 못하도록 설정합니다.
  • Getter와 Setter 메서드를 사용해 데이터를 관리합니다.

✅도전 기능 가이드 Lv.1 ~ 2

  • KioskChallenge1, KioskChallenge2 패키지.

  • ✅Lv 1. 장바구니 및 구매하기 기능을 추가하기

  • 요구사항이 가지는 의도

    • 의도: 클래스 간 연계를 통해 객체 지향 프로그래밍의 기본적인 설계를 익히고, 사용자 입력에 따른 프로그램 흐름 제어와 상태 관리를 학습
    • 목표
      • 클래스 간 역할 분리를 이해하고, 적절히 협력하는 객체를 설계
      • 프로그램 상태 변경 및 데이터 저장을 연습
      • 사용자 입력에 따른 예외 처리와 조건 분기를 연습

  • 장바구니 생성 및 관리 기능
    • 사용자가 선택한 메뉴를 장바구니에 추가할 수 있는 기능을 제공합니다.
    • 장바구니는 메뉴명, 수량, 가격 정보를 저장하며, 항목을 동적으로 추가 및 조회할 수 있어야 합니다.
    • 사용자가 잘못된 선택을 했을 경우 예외를 처리합니다(예: 유효하지 않은 메뉴 번호 입력)
  • 장바구니 출력 및 금액 계산
    • 사용자가 결제를 시도하기 전에, 장바구니에 담긴 모든 메뉴와 총 금액을 출력합니다.
    • 출력 예시
      • 각 메뉴의 이름, 가격, 수량
      • 총 금액 합계
  • 장바구니 담기 기능
    • 메뉴를 클릭하면 장바구니에 추가할 지 물어보고, 입력값에 따라 “추가”, “취소” 처리합니다.
      • 메뉴는 한 번에 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 입니다.

✅Lv 2. Enum, 람다 & 스트림을 활용한 주문 및 장바구니 관리

  • 요구사항이 가지는 의도
    • 의도 : 고급 자바 기능을 활용해 프로그램의 효율성과 코드의 가독성을 개선하는 것을 목표로 합니다.
    • 목적
      • Enum을 통해 상수를 안전하게 관리하고, 프로그램 구조를 간결하게
      • 제네릭을 활용하여 데이터 유연성을 높이고, 재사용 가능한 코드를 설계
      • 스트림 API를 사용하여 데이터를 필터링하고, 간결한 코드로 동작을 구현

  • 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: 취소):

처럼 앞에 번호를 달아주고 싶다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages