✅ 객체 지향 설계를 적용해 순서 제어를 클래스로 관리
Kiosk클래스 생성하기
- 설명: 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스이다.
MenuItem을 관리하는 리스트가 필드로 존재한다.main함수에서 관리하던 입력과 반복문 로직은 이제start함수를 만들어 관리한다.List<MenuItem> menuItems는Kiosk클래스 생성자를 통해 값을 할당한다.
Kiosk객체를 생성하고 사용하는main함수에서 객체를 생성할 때 값을 넘겨준다.
- 요구사항에 부합하는지 검토
- 키오스크 프로그램을 시작하는 메서드가 구현되어야 한다.
- 콘솔에 햄버거 메뉴를 출력한다.
- 사용자의 입력을 받아 메뉴를 선택하거나 프로그램을 종료한다.
- 유효하지 않은 입력에 대해 오류 메시지를 출력한다.
0을 입력하면 프로그램이 ‘뒤로가기’되거나 ‘종료’된다.
package Lv3;
public class Lv3Main {
public static void main(String[] args) {
Lv3Kiosk lv3Kiosk = new Lv3Kiosk();
// Lv3Kiosk 에 있는 menuItems 라는 리스트에 햄버거 정보를 추가
lv3Kiosk.menuItems.add(new Lv3MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
lv3Kiosk.menuItems.add(new Lv3MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
lv3Kiosk.menuItems.add(new Lv3MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
lv3Kiosk.menuItems.add(new Lv3MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
lv3Kiosk.start(); // Lv3Kiosk 에 있는 start 함수 실행
}
}
package Lv3;
public class Lv3MenuItem {
// 1. 속성
String name;
double price;
String foodDetails;
// 2. 생성자
public Lv3MenuItem(String name, double price, String foodDetails){
this.name = name;
this.price = price;
this.foodDetails = foodDetails;
}
// 3. 기능
// 주소값을 출력하는 것이 아닌 리스트안에 들어있는 값을 출력하기 위해 toString 메서드 작성
public String toString(){
return name + " | " + "W" + price + " | " + foodDetails;
}
}
package Lv3;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Lv3Kiosk { // 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스
// 1. 속성
List<Lv3MenuItem> menuItems = new ArrayList<>();
// 2. 생성자
// 3. 기능(메서드)
public void start() { // 입력과 반복문 로직
Scanner scanner = new Scanner(System.in);
System.out.print("햄버거 메뉴를 보시려면 'hamburger'를 입력해주세요. : ");
String shakeshackMenu = scanner.nextLine();
if (!shakeshackMenu.equals("hamburger")) {// 다른 문자를 입력했을 시 다시 입력
while (true) {
System.out.println("다시 입력해주세요.");
System.out.print("햄버거 메뉴를 보시려면 'hamburger'를 입력해주세요. : ");
shakeshackMenu = scanner.nextLine();
if (shakeshackMenu.equals("hamburger")) break;
}
}
// 리스트에 들어가 있는 값을 for문을 통해 출력
System.out.println("[ SHAKESHACK MENU ]");
for (int i = 0; i < menuItems.size(); i++) {
System.out.print(i + 1 + ". ");
System.out.println(menuItems.get(i));
}
System.out.println("0. 종료");
int num; // 메뉴를 선택하기 위한 숫자 변수 생성
do { // 0을 입력하기 전까지 원하는 메뉴 선택
System.out.print("\n원하는 메뉴를 선택해주세요. (0을 입력하시면 종료됩니다.): ");
num = scanner.nextInt();
if (num == 1) {
System.out.println(menuItems.get(0));
} else if (num == 2) {
System.out.println(menuItems.get(1));
} else if (num == 3) {
System.out.println(menuItems.get(2));
} else if (num == 4) {
System.out.println(menuItems.get(3));
}
} while (num != 0);
System.out.println("프로그램을 종료합니다."); // 0을 입력해 do-while 문을 빠져나왔을 때 실행
}
}
main에서 모든 로직을 처리하는 방식이 아닌 각 기능을 명확히 분리하여Kiosk클래스에서 관리하도록 하니 코드의 가독성과 유지보수성이 향상된 것을 느꼈다. 유효하지 않은 입력 처리와 조건을 추가하면서 사용자 경험을 고려한 예외 처리의 중요성도 배우게 되었다.