JAVA

[Java] Lv_3 키오스크

kimyongjun0129 2025. 4. 24. 17:46

 

요구사항

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

 


 

 

문제 풀이

Lv_1 & Lv_2에서 부분에 대한 설명은 생략하겠다.

 

Main

더보기
package com.example.kiosk.lv_2;

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        Kiosk kiosk = new Kiosk(new ArrayList<>());

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

        kiosk.start();
    }
}
  • kiosk를 동작을 start() 메서드로 정의하여, 사용자는 동작 방식을 이해 할 필요 없이 동작할 수 있게 변경하였다.

 

 

Kiosk

더보기
package com.example.kiosk.lv_2;

import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

public class Kiosk {
    // 속성
    List<MenuItem> menuItems;

    // 생성자
    public Kiosk(List<MenuItem> menuItems) {
        this.menuItems = menuItems;
    }

    // 기능
    // 키오스크 동작
    public void start() {
        int input = 1;
        do {
            showMenu();
            System.out.print("메뉴를 선택하세요 : ");
            input = userInput();

            if (totalFoodCount() < input) {
                System.out.println("음식이 없습니다.");
            }
        } while(input != 0);
    }

    // 유저 메뉴 입력 받는 함수
    private int userInput() {
        Scanner scanner = new Scanner(System.in);
        try {
            return scanner.nextInt();
        } catch(InputMismatchException e) {
            System.out.println("올바른 값을 입력하세요.");
            scanner.nextLine();
            return -1;
        }
    }

    // 메뉴 추가하는 기능
    public void addMenu(String foodName, double price, String ingredient) {
        menuItems.add(new MenuItem(foodName, price, ingredient));
    }

    // 메뉴 보여주는 기능
    private void showMenu() {
        int num = 1;

        System.out.println(" [ SHAKESHACK MENU ]");
        System.out.println("0. 종료\t\t\t\t | 종료");
        for (MenuItem foodInfo : menuItems) {
            System.out.println(num++ + ". "
                    + foodInfo.getFood_name() + "\t\t | w "
                    + foodInfo.getPrice() + "\t "
                    + foodInfo.getIngredients());
        }
    }

    // 총 메뉴 갯수 반환하는 기능
    private double totalFoodCount() {
        return (long) menuItems.size();
    }

}
  • 기존의 Main에 있던 메뉴를 보여주고 입력받는 반복문을 start() 메서드로 정의하였다. start() 메서드는 모든 동작이 실행되는 메서드이다.
  • 기존의 Main에 있던 유저한테 입력을 받는 userInput() 메서드를 Kiosk로 이동하였다. 

위 두 가지 방식을 통해 kiosk와 사용자를 완전히 분리하였다.

 

 

MenuItem

더보기
package com.example.kiosk.lv_2;

public class MenuItem {
    private String food_name;
    private double price;
    private String ingredients;

    public MenuItem(String food_name, double price, String ingredients) {
        this.food_name = food_name;
        this.price = price;
        this.ingredients = ingredients;
    }

    public String getFood_name() {
        return food_name;
    }

    public double getPrice() {
        return price;
    }

    public String getIngredients() {
        return ingredients;
    }
}