개발스토리지😃

[Java] 키오스크 만들기 Level4 트러블 슈팅 본문

언어/자바

[Java] 키오스크 만들기 Level4 트러블 슈팅

believekim 2025. 3. 12. 17:08
스파르타내일배움캠프에서 키오스크 만들기 Level4의 개발 과정을 담았다.
이전 계산기를 만들때 요구사항을 주의깊게 듣지 않아 완성도를 떠나 동떨어진 결과가 나왔다.
그래서 이번 과정에서는 요구사항에 시간을 더 투자할 것이다.

 

 

시스템 환경
IDE : Intelli J
language : Java 17

 

 

https://github.com/pleasebelieveme/sparta_nbcamp/tree/main/java-course/src/assignment/kiosk/level4

 

sparta_nbcamp/java-course/src/assignment/kiosk/level3 at main · pleasebelieveme/sparta_nbcamp

Contribute to pleasebelieveme/sparta_nbcamp development by creating an account on GitHub.

github.com

 


 

 

1. 요구사항

1. Menu클래스 생성하기
2. List<MenuItem>를 Menu클래스가 관리하도록 변경 (Kiosk -> Menu)

 

 

  • 클래스 역할 정의
클래스 역할
Main Kiosk 시작, Menu
Kiosk 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스
Menu MenuItem 클래스를 관리하는 클래스
MenuItem 개별 음식 항목을 관리하는 클래스(이름, 가격, 설명)

 


 

 

2. Menu클래스 생성

  • 카테고리 필드를 추가
  • Menu객체를 생성할 때 MenuItem 기본값 초기화
public class Menu {
  private String category;
  private List<MenuItem> menuItems;

  Menu(String category) {
	this.category = category;
	this.menuItems = initializeMenu(category);
  }
  // getter
  // setter

  // 메뉴아이템 값 주입 함수
  private List<MenuItem> initializeMenu(String category) {
	// List를 리턴하는 함수
	List<MenuItem> menuItems = new ArrayList<>();
	if (category.equals("burger")) {
	  menuItems.add(new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
      ...
	} else if (category.equals("drink")) {
	  menuItems.add(new MenuItem("Coke", 2.5, "탄산이 들어간 청량한 음료"));
	  ...
	} else if (category.equals("dessert")) {
	  menuItems.add(new MenuItem("Ice Cream", 4.0, "부드럽고 달콤한 바닐라 아이스크림"));
	  ...
	}
	  return menuItems;
	}
}

 


 

 

3. Kiosk클래스 Level3에서 수정된 내용

  • Kiosk객체를 생성할 때 Menu객체 기본값 초기화
Kiosk() {
  this.menus = new ArrayList<>();
  menus.add(new Menu("burger"));
  ...
}

 


 

 

  • 카테고리 선택 로직 추가
  • 카테고리 선택 if문 안에 메뉴아이템 선택 로직 작성
// 카테고리 선택 처리
  if (categoryChoice >= 1 && categoryChoice <= menus.size()) {
	// 메뉴출력
	int idx = 1;
	for (MenuItem m : menus.get(categoryChoice-1).getMenuItems()) {
	  System.out.println(idx++ + ". " + m.getName() + "   | W " + m.getPrice() + " | " + m.getDetails());
	}
	System.out.println("0. 뒤로가기\n");

	// 사용자 입력 숫자 검증
	if (!sc.hasNextInt()) { ... }

	// 사용자 입력 저장
	int itemChoice = sc.nextInt();

	// 메뉴 번호 범위 체크
	if (itemChoice < 0 || itemChoice > menus.get(categoryChoice-1).getMenuItems().size()) {
	  System.out.println("메뉴에 나와있는 번호를 입력해주세요.\n");
	  continue;
	}

	// 메뉴 선택 처리
	if (itemChoice >= 1 && itemChoice <= menus.get(categoryChoice-1).getMenuItems().size()) {
	  System.out.println("선택한 메뉴: " + menus.get(categoryChoice-1).getMenuItems().get(itemChoice-1).getName() +
	  ", 가격: " + menus.get(categoryChoice-1).getMenuItems().get(itemChoice-1).getPrice() +
	  ", 설명: " + menus.get(categoryChoice-1).getMenuItems().get(itemChoice-1).getDetails() + "\n");
	} else if (itemChoice == 0) {
	  continue;
	}
  } else if (categoryChoice == 0) {
	flag = false;
	System.out.println("프로그램을 종료합니다.");
  }
} // while

 


 

4. 트러블 슈팅

  • switch문을 if문으로 변경
- TO-BE: level3에서 switch문을 아래와 같이 리팩토링을 하였다.
switch (choice) {
  case 1, 2, 3, 4 ->
	System.out.println("선택한 메뉴: " + menuItems.get(choice-1).getName() + ", 가격: " + menuItems.get(choice-1).getPrice() + ", 설명: " + menuItems.get(choice-1).getDetails()+ "\n");
  case 0 -> {
	flag = false;
	System.out.println("프로그램을 종료합니다.");
  }
} // switch​


- 문제점은 메뉴가 추가 될때마다 switch문을 고쳐야 하기에 코드를 바꾸지 않고 메뉴를 추가하는 방법을 고안했다.


- AS-IS:
- 코드는 더 길어졌지만 size()로 범위를 지정함으로써 해결하였다.
if (itemChoice >= 1 && itemChoice <= menus.get(categoryChoice-1).getMenuItems().size()) {
  System.out.println("선택한 메뉴: " + menus.get(categoryChoice-1).getMenuItems().get(itemChoice-1).getName() +
  	", 가격: " + menus.get(categoryChoice-1).getMenuItems().get(itemChoice-1).getPrice() +
	", 설명: " + menus.get(categoryChoice-1).getMenuItems().get(itemChoice-1).getDetails() + "\n");
} else if (itemChoice == 0) {
  continue;
}