본문 바로가기

JAVA

[Java] Lv_2 키오스크

 

요구사항

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

  • ⬜ MenuItem 클래스 생성하기
    • ⬜ 설명 : 개별 음식 항목을 관리하는 클래스입니다. 현재는 햄버거만 관리합니다.
    • ⬜ 클래스는 이름, 가격, 설명 필드를 갖습니다.
  • ⬜ main 함수에서 MenuItem 클래스를 활용하여 햄버거 메뉴를 출력합니다.
    • ⬜ MenuItem 객체 생성을 통해 이름, 가격, 설명을 세팅합니다.
      • ⬜ 키워드: new
    • ⬜ List를 선언하여 여러 MenuItem을 추가합니다.
      • ⬜ List<MenuItem> menuItems = new ArrayList<>();
    • ⬜ 반복문을 활용해 menuItems를 탐색하면서 하나씩 접근합니다.

 


 

 

문제 풀이

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

 

Main

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

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

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

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

        Scanner scanner = new Scanner(System.in);
        int input = 1;

        do {
            kiosk.showMenu();
            System.out.print("메뉴를 선택하세요 : ");
            input = userInput(scanner);

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

    public static int userInput(Scanner scanner) {
        try {
            return scanner.nextInt();
        } catch(InputMismatchException e) {
            System.out.println("올바른 값을 입력하세요.");
            scanner.nextLine();
            return -1;
        }
    }
}
  • kiosk 객체에 있는 addMenu() 메서드를 통해 원하는 메뉴를 키오스크에 등록할 수 있다.
  • Lv_1에서 showMenu() 메서드도 kiosk 클래스 안으로 넣었다.
  • main에서는 키오스크를 사용하기만 한다. (완전 분리)
  • 사용자의 Input을 userInput() 메서드로 분리하였다. → 가독성 향상

 

 

Kiosk

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

import java.util.ArrayList;
import java.util.List;

public class Kiosk {
    // 속성
    List<MenuItem> foodList = new ArrayList<>();

    // 생성자

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

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

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

    public double totalFoodCount() {
        return (long) foodList.size();
    }
}
  • 메뉴를 추가하는 기능
  • 메뉴를 보여주는 기능
  • 총 음식 갯수를 반환하는 기능

 

 

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;
    }
}
  • 키오스크에서 등록될 메뉴의 속성을 관리하는 클래스이다.

 


 

 

트러블 슈팅

다음 코드는 위 Main 클래스의 코드 중 일부분을 수정해서 가져온 코드이다.

public static int userInput(Scanner scanner) {
    try {
        return scanner.nextInt();
    } catch(RuntimeException e) {
        System.out.println("올바른 값을 입력하세요.");
        scanner.nextLine();
        return -1;
    }
}

 

예외처리를 RuntimeException으로 한 번에 묶어서 처리를 진행하였다. 이는 안티 패턴이다. 그 이유는 다음과 같다.

  • RuntimeException은 언체크 예외의 상위 클래스이다. 따라서 RuntimeException을 상속받는 다른 세밀한 객체들에 대한 예외가 터지면, RuntimeException으로 처리가 된다. → 이는 어떤 예외인지 분명하게 알 수 없게 만든다.

 

따라서 다음과 같이 코드를 수정하였다.

public static int userInput(Scanner scanner) {
    try {
        return scanner.nextInt();
    } catch(InputMismatchException e) {
        System.out.println("올바른 값을 입력하세요.");
        scanner.nextLine();
        return -1;
    }
}
  • InputMismatchException : Scanner 클래스를 사용할 때 입력된 데이터의 타입이 예상한 타입과 일치하지 않을 경우 발생한다.

'JAVA' 카테고리의 다른 글

[Java] Lv_4 & 5 키오스크 문제  (0) 2025.04.25
[Java] Lv_3 키오스크  (0) 2025.04.24
[Java] Lv_1 키오스크  (0) 2025.04.24
[Java] 예외 처리  (0) 2025.04.23
[Java] Lv_3 계산기 문제  (0) 2025.04.22