[내일배움캠프 14일차] Kiosk과제 - 필수구현 (Level 1~3)

김현정·2025년 3월 8일
0

3월 7일 두 번째 과제
KioskProject를 구현하기 입니다.

키오스크를 구현하면서 키오스크 기능을 파악하여 클래스들을 설계합니다.
여러 키오스크의 클래스를 만들면서 주요 기능을 메소드로 분리합니다.
콘솔 기반으로 구현하며 데이터 흐름을 설계합니다.

필수구현

클래스 정의

  • Main : 시작 지점이 되는 클래스, public static void main(String[] args)
  • MenuItem: 세부 메뉴 속성 가지는 클래스
    • 햄버거의 이름, 가격설명
      • 예시: ShackBurger, 6.9, 토마토, 양상추, 쉑소스가 토핑된 치즈버거
      • new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거")
    • 햄버거의 이름, 가격설명
      • 예시: ShackBurger, 6.9, 토마토, 양상추, 쉑소스가 토핑된 치즈버거
      • new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거")
  • Kiosk: 프로그램 순서 및 흐름 제어를 담당하는 클래스
  • Menu: MenuItem 클래스를 관리하는 클래스
    • 예시 : 버거 메뉴, 음료 메뉴 등 각 카테고리 내에 여러 MenuItem을 포함합니다.


Level 1 - 기본적인 키오스크를 프로그래밍 해보자.

  • 요구사항이 가지는 의도
    • 입력 처리와 간단한 흐름 제어를 복습합니다. (프로그래밍 검증)
    • 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을 입력

프로그램을 종료합니다.

Main 클래스에 사용자의 입력과 처리를 Scanner를 선언하여 데이터를 선언을 합니다.

import java.util.Scanner;

public class Main {
    public static void main (String[] args) {

        Scanner sc = new Scanner(System.in);

그 뒤에 SHAKESHACK MENU를 구현하기 위해 저만의 방식을 사용하여 메뉴판을 꾸몄습니다.

[                           SHAKESHACK MENU                            ]
-----------------------------------------------------------------------
| 1. ShackBurger     |  W 6.9  |  토마토, 양상추, 쉑소스가 토핑 된 치즈버거     |
-----------------------------------------------------------------------
| 2. SmokeShack      |  W 8.9  |  베이컨, 체리 페퍼에 쉑소스가 토핑 된 치즈버거  |
-----------------------------------------------------------------------
| 3. Cheeseburger    |  W 6.9  |  포테이토 번과 비프패티, 치즈가 토핑 된 치즈버거 |
-----------------------------------------------------------------------
| 4. Hamburger       |  W 5.4  |  비프패티를 기반으로 야채가 들어간 기본버거     |
-----------------------------------------------------------------------
| 0. 종료             |  종료                                         |

System.out.println("");을 사용하여 하나씩 출력하였습니다.
그 뒤에 번호를 입력받아 원하는 메뉴를 선택하거나 종료가 되는 것을 구현하려합니다.

int answer;
System.out.print(" 번호를 입력하세요 : ");
answer = sc.nextInt()

일단, int answer;로 answer이라는 번호 입력받은 값을 초기에 선언을 해주고
scanner을 이용하여 사용자의 번호를 입력 받습니다.

switch (answer) {
    case 1 :
       System.out.println("ShackBurger를 선택하셨습니다. \n");
       break;
    case 2 :
       System.out.println("SmokeShack를 선택하셨습니다.\n");
       break;
    case 3 :
       System.out.println("CheeseBurger를 선택하셨습니다.\n");
       break;
    case 4 :
       System.out.println("HamBurger를 선택하셨습니다.\n");
       break;
    case 0 :
       break;
    default :
       System.out.println("번호를 잘못 입력하셨습니다. 다시 입력해주세요. \n");

switch문을 사용하여 answer 값이 1 ~ 4를 선택하면 선택한 메뉴에 대해서 출력을 해주고,
(\n은 문자열에서 줄바꿈을 의미)
0을 입력하면 빠져나오는 것을 설정했습니다. (이유는 그 다음에 알려드립니다.)
default를 사용해서 0 ~ 4이 아닌 다른 숫자를 입력하였다면, 번호를 잘못 입력하셨습니다. 다시 입력해주세요. 라는 안내메세지를 출력하게 하였습니다.

저는 다시 입력을 받기위해서 do - while문을 사용하였습니다.

Scanner sc = new Scanner(System.in);
        int answer;
        do {
            System.out.println("[   SHAKESHACK MENU   ]");
            System.out.println("1. ShackBurger   | W 6.9 | 토마토, 양상추, 쉑소스가 토핑 된 치즈버거");
            System.out.println("-----------------------------------------------------------");
            System.out.println("2. SmokeShack    | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑 된 치즈버거");
            System.out.println("-----------------------------------------------------------");
            System.out.println("3. CheeseBurger  | W 8.9 | 포테이토 번과 비프패티, 치즈가 토핑 된 치즈버거");
            System.out.println("-----------------------------------------------------------");
            System.out.println("4. HamBurger     | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거");
            System.out.println("-----------------------------------------------------------");
            System.out.println("0. 0을 입력하면 종료가 됩니다. | 종료 ");
            System.out.println("-----------------------------------------------------------");
            System.out.print(" 번호를 입력하세요 : ");
            answer = sc.nextInt();

            switch (answer) {
                case 1 :
                    System.out.println("ShackBurger를 선택하셨습니다. \n");
                    break;
                case 2 :
                    System.out.println("SmokeShack를 선택하셨습니다.\n");
                    break;
                case 3 :
                    System.out.println("CheeseBurger를 선택하셨습니다.\n");
                    break;
                case 4 :
                    System.out.println("HamBurger를 선택하셨습니다.\n");
                    break;
                case 0 :
                    break;
                default :
                    System.out.println("번호를 잘못 입력하셨습니다. 다시 입력해주세요. \n");

            }

        } while (answer != 0);

        System.out.println("프로그램을 종료합니다.");
        sc.close();

(제가 level2부터 메뉴판 이미지를 변경하여 위에 코드랑 메뉴판 이미지랑 다를 수 있습니다.)

switch문에서 1,2,3,4를 입력받으면 선택한 메뉴에 대한 설명메세지가 출력된 후 다시 메뉴판을 보여줍니다.
0을 입력받으면 break가 되어 answer값이 0이 되고, while의 answer값이 0이면 빠져나오기에 프로그램이 종료가 됩니다. 그 이외의 번호가 출력되면 다시 입력하라는 메세지가 출력되고 다시 메뉴판을 보여줍니다.

Level 2 - 객체 지향 설계를 적용해 햄버거 메뉴를 클래스로 관리하기

  • 요구사항이 가지는 의도
    • 객체 지향 개념을 학습하고, 데이터를 구조적으로 관리하며 프로그램을 설계하는 방법을 익힙니다.
    • 햄버거 메뉴를 MenuItem 클래스와 List를 통해 관리합니다.

  • MenuItem 클래스 생성하기
    • 설명 : 개별 음식 항목을 관리하는 클래스입니다. 현재는 햄버거만 관리합니다.
    • 클래스는 이름, 가격, 설명 필드를 갖습니다.
  • main 함수에서 MenuItem 클래스를 활용하여 햄버거 메뉴를 출력합니다.
    • MenuItem 객체 생성을 통해 이름, 가격, 설명을 세팅합니다.
      • 키워드: new
    • List를 선언하여 여러 MenuItem을 추가합니다.
      • List<MenuItem> menuItems = new ArrayList<>();
    • 반복문을 활용해 menuItems를 탐색하면서 하나씩 접근합니다.
  • 구조 예시
public static void main(String[] args) {
		// List 선언 및 초기화
		// add 함수를 통해 new MenuItem(이름, 가격, 설명) List에 삽입
		
		// Scanner 선언
		
		// 반복문을 활용해 List 안에 있는 MenuItem을 하나씩 출력
		// 숫자를 입력 받기
		// 입력된 숫자에 따른 처리
			// 프로그램을 종료
			// 선택한 메뉴 : 이름, 가격, 설명
}

level 2는 Main클래스와 MenuItem클래스를 분리합니다.
햄버거 메뉴를 MenuItem클래스와 List를 통해 관리합니다.

    private String burgerName;
    private double price;
    private String description;

MenuItem클래스의 속성을 이름과 가격 설명을 캡슐화하고,

    public MenuItem ( String burgerName, double price, String description) {
        this.burgerName = burgerName;
        this.description = description;
        this.price = price;
    }

생성자에서는 매개변수의 선언을 해줍니다.

    // 게터를 이용하여 버거이름, 가격, 설명 반환
    public String getBurgerName() {
        return burgerName;
    }

    public String getDescription() {
        return description;
    }

    public double getPrice() {
        return price;
    }

기능에서는 게터를 이용하여 버거이름, 가격, 설명을 반환하였습니다.

그 다음 메뉴로 넘어가서 (level1의 틀을 그대로 사용)

        List<MenuItem> menuItems = new ArrayList<>();

        // 메뉴 항목 추가
        menuItems.add(new MenuItem("ShackBurger ", 6.9, "토마토, 양상추, 쉑소스가 토핑 된 치즈버거    "));
        menuItems.add(new MenuItem("SmokeShack  ", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑 된 치즈버거 "));
        menuItems.add(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑 된 치즈버거"));
        menuItems.add(new MenuItem("Hamburger   ", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거    "));

List를 선언을 해주고, 그 뒤에 메뉴에 대한 항목을 추가하였습니다.

  • List라는 인터페이스를 MenuItem의 객체를 순서대로 저장할 수 있습니다.
  • "<"MenuItem">"은 제네릭 타입으로 이 리스트는 오직 MenuItem타입의 객체만 저장가능합니다.
  • 그렇기에 menuItems 리스트 타입에 값을 추가하기 위해서 add()를 사용합니다.
  • add(new MenuItem(매개변수));로 새로운 객체를 생성하여 매개변수에 맞게 값을 넣어줍니다.
            System.out.println("[   SHAKESHACK MENU   ]");
            System.out.println("---------------------------------------------------------------------");

            for (int i = 0; i < menuItems.size(); i++) {
                MenuItem item = menuItems.get(i);
                System.out.println("| " + (i +1) + ". " + item.getBurgerName() +
                        "    |  W" + item.getPrice() + "  |  " + item.getDescription() + " |");
                System.out.println("---------------------------------------------------------------------");
                }

level 1에서 메뉴를 System.out.println으로 하나하나 손으로 선언하였다면
for문을 사용하여 메뉴를 출력하였습니다. (이렇게 하면 메뉴가 늘어나도 손쉽게 메뉴판을 고칠 수 있습니다.)

  • for문 안에 MenuItem item = menuItems.get(i);로 menuItems.get(i) → i번째 인덱스의 MenuItem 객체를 가져오고, 가져온 객체를 item 변수에 저장합니다.
  • item.getBurgerName() → MenuItem 객체의 버거 이름 출력하고, item.getPrice() → 가격 출력하고, item.getDescription() → 설명 출력합니다. (여기서 getBurgerName 등은 MenuItem의 매개변수)
          System.out.println("| 0. 종료             | 종료                                           |");
            System.out.println("---------------------------------------------------------------------");
            while (true) {
                System.out.print("번호를 입력하세요 : ");
                answer = sc.nextInt();
                if (answer >=0 && answer <= 4) {
                    break;
                }
                System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
            }

        } while (answer != 0 && (answer < 1 || answer > 4));

사용자에게 입력받는 값 또한 level 1과 동일하게 while문으로 answer값에 따라서 프로그램이 종료가 되거나 반복되게 만들었습니다.

      if (answer != 0) {
            MenuItem selectedItem = menuItems.get(answer - 1);
            System.out.println("\n선택한 메뉴: " + selectedItem.getBurgerName());
            System.out.println("가격: W" + selectedItem.getPrice());
            System.out.println("설명: " + selectedItem.getDescription() + "\n");
        }

하지만 조금 다른 점은 do-while문 밖에 메뉴를 설명해주는 것을 리스트로 받아서 설정해놨습니다.

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

  • 요구사항이 가지는 의도
    • 객체 지향 개념을 학습하고, 데이터를 구조적으로 관리하며 프로그램을 설계하는 방법을 익힙니다.
    • main 함수에서 관리하던 전체 순서 제어를 Kiosk 클래스를 통해 관리합니다.
  • Kiosk 클래스 생성하기
    • 설명: 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스입니다.
    • MenuItem을 관리하는 리스트가 필드로 존재합니다.
    • main 함수에서 관리하던 입력과 반복문 로직은 이제 start 함수를 만들어 관리합니다.
    • List<MenuItem> menuItemsKiosk 클래스 생성자를 통해 값을 할당합니다.
      • Kiosk 객체를 생성하고 사용하는 main 함수에서 객체를 생성할 때 값을 넘겨줍니다.
  • 요구사항에 부합하는지 검토
    • 키오스크 프로그램을 시작하는 메서드가 구현되어야 합니다.
      • 콘솔에 햄버거 메뉴를 출력합니다.
      • 사용자의 입력을 받아 메뉴를 선택하거나 프로그램을 종료합니다.
      • 유효하지 않은 입력에 대해 오류 메시지를 출력합니다.
      • 0을 입력하면 프로그램이 ‘뒤로가기’되거나 ‘종료’됩니다.

level 3는 Kiosk 클래스를 생성하여 Main클래스에 있는 입출력과 반복문 로직을 옮기는 것입니다.
Main 클래스에는 이제 Kiosk의 start라는 함수만 호출시켜 실행을 시킵니다.

일단 Kiosk 클래스를 생성합니다. Kiosk 클래스에서 사용자의 입출력을 받아올 것이기에 Scanner을 선언해줍니다. 그 뒤에 level 2의 MenuItems의 리스트를 Kiosk로 옮겨줍니다.

    Scanner sc = new Scanner(System.in);

    // 속성
    List<MenuItem> menuItems;


    // 생성자
    public Kiosk () {
        menuItems = new ArrayList<>();
        menuItems.add(new MenuItem("ShackBurger ", 6.9, "토마토, 양상추, 쉑소스가 토핑 된 치즈버거    "));
        menuItems.add(new MenuItem("SmokeShack  ", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑 된 치즈버거 "));
        menuItems.add(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑 된 치즈버거"));
        menuItems.add(new MenuItem("Hamburger   ", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거    "));

    }

속성에는 리스트 변수를 선언해주고 생성자에서 ArrayList로 설정합니다.
그 뒤에 menuItems 리스트에 햄버거 메뉴들을 추가해줍니다.

    public void start () {


        int answer;

        do {
            // 메뉴 출력
            System.out.println("[   SHAKESHACK MENU   ]");
            System.out.println("---------------------------------------------------------------------");

            for (int i = 0; i < menuItems.size(); i++) {
                MenuItem item = menuItems.get(i);
                System.out.println("| " + (i + 1) + ". " + item.getBurgerName() +
                        "    |  W" + item.getPrice() + "  |  " + item.getDescription() + " |");
                System.out.println("---------------------------------------------------------------------");

            }
            System.out.println("| 0. 종료             | 종료                                           |");
            System.out.println("---------------------------------------------------------------------");
            while (true) {
                System.out.print("번호를 입력하세요 : ");
                answer = sc.nextInt();
                if (answer >= 0 && answer <= 4) {
                    break;
                }
                System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
            }

        } while (answer != 0 && (answer < 1 || answer > 4));

        if (answer != 0) {
            MenuItem selectedItem = menuItems.get(answer - 1);
            System.out.println("\n선택한 메뉴: " + selectedItem.getBurgerName());
            System.out.println("가격: W" + selectedItem.getPrice());
            System.out.println("설명: " + selectedItem.getDescription() + "\n");
        }

        System.out.println("프로그램을 종료합니다.");
        sc.close();
    }

Kiosk 클래스에 start라는 메소드를 생성해 Main클래스에 있었던 반복문들의 로직을 옮겨줍니다.

public class Main {
    public static void main (String[] args) {
        Kiosk kiosk = new Kiosk();
        kiosk.start();
    }
}

그러면 Main클래스는 이렇게 Kiosk 객체를 생성해주고 start함수를 호출해주는 코드만 남게됩니다.

0개의 댓글