[JAVA] 키오스크(2)

림민지·2025년 3월 10일

Today I Learn

목록 보기
20/62

✏️ 목표 : 객체 지향 설계를 적용해 순서 제어를 클래스로 관리하기

  • 총액 합산 에러 고치기
  • main 함수에서 관리하던 전체 순서 제어를 Kiosk 클래스를 통해 관리합니다.
  • Kiosk 클래스 생성하기
    • MenuItem을 관리하는 리스트가 필드로 존재합니다.
    • main 함수에서 관리하던 입력과 반복문 로직은 이제 start 함수를 만들어 관리합니다.
    • List<MenuItem> menuItemsKiosk 클래스 생성자를 통해 값을 할당합니다.
      • Kiosk 객체를 생성하고 사용하는 main 함수에서 객체를 생성할 때 값을 넘겨줍니다.

🛠️ 총액 합산 트러블 슈팅

메뉴를 선택하고 키오스크를 종료할 때까지 금액을 모두 합산하는 totalPrice 변수를 만들었었다.

 static private double totalPrice =0; //총액을 저장
 ...중략
		System.out.println("총액은 "+String.format("%.1f",totalPrice)+"W"); //가격 합산하기
		System.out.println("총액은 "+totalPrice+"W");

문제점

: 가격을 3개 이상 더하면 소수점이 .00000003 의 형태로 바뀐다는 것.
출력 : 총액은 22.700000000000003W

해결방법

이유는 double 타입의 010101 형태로 저장하다가 비트수를 넘어섰기 때문이었다. 때문에 소수점 1번째 자리까지만 출력할 수 있도록 강제하기로 했다.
기존 "총액은 "totalPrice"W" 이 형태에서 ✨format메서드✨를 사용했다!

System.out.println("총액은 "+String.format("%.1f",totalPrice)+"W");
System.out.println("총액은 "+totalPrice+"W");

2단계에서는 MainMenuItem 클래스만으로 구성했었는데,
이제 Main에서는 키오스크를 시작하는 기능만 구성하고 나머지 반복과 입력은 모두 Kiosk 클래스에서 관리해야한다.

0️⃣ 클래스 다이어그램 구성

1️⃣ Kiosk 클래스 만들기

먼저 Kiosk 클래스를 만들어 Main에 있던 기능을 옮겨 관리하도록 해보자

옮겨야할 기능

  • 메뉴아이템 리스트
  • 메뉴 추가
  • 입력 및 반복
  • 합산하기(총 금액)

1. private로 관리하기

메뉴 리스트나 총 합산 금액 등이 함부로 접근되면 안되기 때문에 private 타입으로 정의해주자

static private final List<MenuItem3> burgers = new ArrayList<>(); //햄버거 메뉴 리스트 만들기
static private double totalPrice =0; //총액을 저장

2. 생성자

public Kiosk3(){
	burgers.add(new MenuItem3(1,"ShackBurger   ", 6.9, "토마토, 양상추, 쉑 소스가 토핑된 치즈버거"));
    burgers.add(new MenuItem3(2,"SmokeShack    ", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
    burgers.add(new MenuItem3(3,"Cheeseburger  ", 6.9,"포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
    burgers.add(new MenuItem3(4,"Hamburger     ", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
    }

3. 메뉴 관리 및 사용자 입력 처리하기

키오스크를 시작해 처음 보여줄 메뉴판을 출력하고

public class Kiosk3 {
    //메뉴판 출력하기
    public void start(){
        System.out.println("햄버거 키오스크를 시작합니다--------------");
        System.out.println("[ SHAKESHACK MENU ]");
        for (MenuItem3 burger : burgers) {
            System.out.println(burger.getNumbering()+". " +burger.getName() + "   | W "+burger.getPrice()+" | "+burger.getDescription());
        }
        System.out.println("0. 종료              | 키오스크를 종료합니다");
    }

OrderByKiosk 메서드를 정의해서 메뉴를 선택하고 반복할 수 있도록 했다.

    //메뉴 선택하기
    public void OrderByKiosk(){
        Scanner scanner = new Scanner(System.in); //스캐너 불러오기
        while (true) {
            //메뉴 입력 받기
            System.out.print("원하는 메뉴의 번호를 입력하세요 : ");
            int select = scanner.nextInt();


            if (select == 0){
                System.out.println("프로그램을 종료합니다.");
                break;
            } else {
                totalPrice += burgers.get(select-1).getPrice(); //가격 합산하기
                System.out.println("지금까지 총액은 "+totalPrice+"W");
            }
        }
    }

2️⃣ Main 클래스

메인클래스에서 Kiosk클래스의 메서드를 불러와서 사용하자

public class Main3 {
    public static void main(String[] args) {
        Kiosk3 kiosk = new Kiosk3(); //kiosk클래스 불러오기
        kiosk.start();
        kiosk.OrderByKiosk();
    }
}

Kiosk 클래스를 kiosk라는 이름으로 불러와서 메서드를 실행하자


3️⃣ 예외 처리하기

메뉴판에 존재하지 않는 번호를 입력하는 것과 같이 유효하지 않은 입력을 했을 때의 예외처리를 해야한다.
예외가 떴을 때, 빨간줄로 콘솔에 뜨면 안예쁘고 빡치고, 종료되지 않고 경고 문구와 함께 사용자가 다시 입력할 수 있도록 도와햐하니까!

try-catch문과 throw new 를 사용해서 에러를 던져보자

1. findMenu 메서드

먼저 메뉴 리스트에 입력한 메뉴가 존재하는지 검증하는 메서드를 만들자

public String findMenu(int select) {
        if (select <0 || select >burgers.size()){
            //번호 잘못 입력했을때 에러 던져주기
            throw new IllegalArgumentException(select+"번째 메뉴는 존재하지 않습니다");
        }
        return  burgers.get(select-1).getName();
    }

select한 번째의 메뉴가 존재하면 그대로 return해주고, 아니면 IllegalArgumentException을 던져줬다

2. 기존 코드 리팩토링

기존에는 그냥 while문으로 돌렸던 코드를 trt-catch와 함께 돌려보자

(1) 메뉴 번호 입력받기 select
(2) tryfindMenu 메서드에다가 select를 넣어서 메뉴가 존재하는지 검증
(3) 존재하면 그대로 아래의 출력 진행
(4) 존재하지 않으면 catch로 넘겨서 findMenu에서 뱉어준 오류 낚아채기!
→ "error : "+e.getMessage()" 형태로 출력된다

 while (true) {
            //메뉴 입력 받기
            System.out.print("원하는 메뉴의 번호를 입력하세요 : ");
            int select = scanner.nextInt();
            try {
                if (select == 0){
                    System.out.println("프로그램을 종료합니다.");
                    break;
                } else {
                    String MenuName = findMenu(select);
                    System.out.println(MenuName+"를 선택하셨습니다");
                    System.out.println("총액은 "+String.format("%.1f",totalPrice)+"W"); //가격 합산하기
                    System.out.println("총액은 "+totalPrice+"W");
                    System.out.println("======================");
                }
            } catch (IllegalArgumentException e){
                System.out.println("error : "+e.getMessage()); //에러 뱉기
            }

🚧 검토

  • 키오스크 프로그램을 시작하는 메서드가 구현되어야 합니다.
    → start()메서드

  • 콘솔에 햄버거 메뉴를 출력합니다.

  • 사용자의 입력을 받아 메뉴를 선택하거나 프로그램을 종료합니다.
    → select로 선택

  • 유효하지 않은 입력에 대해 오류 메시지를 출력합니다.
    → IllegalArgumentException으로 예외처리

  • 0을 입력하면 프로그램이 ‘뒤로가기’되거나 ‘종료’됩니다.
    → select에 0 입력

profile
@lim_128

0개의 댓글