3월 7일 두 번째 과제
KioskProject를 구현하기 입니다.
키오스크를 구현하면서 키오스크 기능을 파악하여 클래스들을 설계합니다.
여러 키오스크의 클래스를 만들면서 주요 기능을 메소드로 분리합니다.
콘솔 기반으로 구현하며 데이터 흐름을 설계합니다.
public static void main(String[] args)
new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거")
new MenuItem("ShackBurger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거")
토예시 : 버거 메뉴, 음료 메뉴 등 각 카테고리 내에 여러 MenuItem
을 포함합니다.
Scanner
활용법, 조건문, 반복문을 재확인하며 입력 데이터를 처리하는 방법 강화[ SHAKESHACK MENU ]
1. ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
2. SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
3. Cheeseburger | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거
4. Hamburger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거
0. 종료 | 종료
0 <- // 0을 입력
프로그램을 종료합니다.
Main 클래스에 사용자의 입력과 처리를 Scanner를 선언하여 데이터를 선언을 합니다.
import java.util.Scanner;
public class Main {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
그 뒤에 SHAKESHACK MENU를 구현하기 위해 저만의 방식을 사용하여 메뉴판을 꾸몄습니다.
[ SHAKESHACK MENU ]
-----------------------------------------------------------------------
| 1. ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑 된 치즈버거 |
-----------------------------------------------------------------------
| 2. SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑 된 치즈버거 |
-----------------------------------------------------------------------
| 3. Cheeseburger | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑 된 치즈버거 |
-----------------------------------------------------------------------
| 4. Hamburger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거 |
-----------------------------------------------------------------------
| 0. 종료 | 종료 |
System.out.println("");을 사용하여 하나씩 출력하였습니다.
그 뒤에 번호를 입력받아 원하는 메뉴를 선택하거나 종료가 되는 것을 구현하려합니다.
int answer;
System.out.print(" 번호를 입력하세요 : ");
answer = sc.nextInt()
일단, int answer;로 answer이라는 번호 입력받은 값을 초기에 선언을 해주고
scanner을 이용하여 사용자의 번호를 입력 받습니다.
switch (answer) {
case 1 :
System.out.println("ShackBurger를 선택하셨습니다. \n");
break;
case 2 :
System.out.println("SmokeShack를 선택하셨습니다.\n");
break;
case 3 :
System.out.println("CheeseBurger를 선택하셨습니다.\n");
break;
case 4 :
System.out.println("HamBurger를 선택하셨습니다.\n");
break;
case 0 :
break;
default :
System.out.println("번호를 잘못 입력하셨습니다. 다시 입력해주세요. \n");
switch문을 사용하여 answer 값이 1 ~ 4를 선택하면 선택한 메뉴에 대해서 출력을 해주고,
(\n은 문자열에서 줄바꿈을 의미)
0을 입력하면 빠져나오는 것을 설정했습니다. (이유는 그 다음에 알려드립니다.)
default를 사용해서 0 ~ 4이 아닌 다른 숫자를 입력하였다면, 번호를 잘못 입력하셨습니다. 다시 입력해주세요. 라는 안내메세지를 출력하게 하였습니다.
저는 다시 입력을 받기위해서 do - while문을 사용하였습니다.
Scanner sc = new Scanner(System.in);
int answer;
do {
System.out.println("[ SHAKESHACK MENU ]");
System.out.println("1. ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑 된 치즈버거");
System.out.println("-----------------------------------------------------------");
System.out.println("2. SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑 된 치즈버거");
System.out.println("-----------------------------------------------------------");
System.out.println("3. CheeseBurger | W 8.9 | 포테이토 번과 비프패티, 치즈가 토핑 된 치즈버거");
System.out.println("-----------------------------------------------------------");
System.out.println("4. HamBurger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거");
System.out.println("-----------------------------------------------------------");
System.out.println("0. 0을 입력하면 종료가 됩니다. | 종료 ");
System.out.println("-----------------------------------------------------------");
System.out.print(" 번호를 입력하세요 : ");
answer = sc.nextInt();
switch (answer) {
case 1 :
System.out.println("ShackBurger를 선택하셨습니다. \n");
break;
case 2 :
System.out.println("SmokeShack를 선택하셨습니다.\n");
break;
case 3 :
System.out.println("CheeseBurger를 선택하셨습니다.\n");
break;
case 4 :
System.out.println("HamBurger를 선택하셨습니다.\n");
break;
case 0 :
break;
default :
System.out.println("번호를 잘못 입력하셨습니다. 다시 입력해주세요. \n");
}
} while (answer != 0);
System.out.println("프로그램을 종료합니다.");
sc.close();
(제가 level2부터 메뉴판 이미지를 변경하여 위에 코드랑 메뉴판 이미지랑 다를 수 있습니다.)
switch문에서 1,2,3,4를 입력받으면 선택한 메뉴에 대한 설명메세지가 출력된 후 다시 메뉴판을 보여줍니다.
0을 입력받으면 break가 되어 answer값이 0이 되고, while의 answer값이 0이면 빠져나오기에 프로그램이 종료가 됩니다. 그 이외의 번호가 출력되면 다시 입력하라는 메세지가 출력되고 다시 메뉴판을 보여줍니다.
MenuItem
클래스와 List
를 통해 관리합니다.MenuItem
클래스 생성하기이름
, 가격
, 설명
필드를 갖습니다.main
함수에서 MenuItem
클래스를 활용하여 햄버거 메뉴를 출력합니다.MenuItem
객체 생성을 통해 이름
, 가격
, 설명
을 세팅합니다.new
List
를 선언하여 여러 MenuItem
을 추가합니다.List<MenuItem> menuItems = new ArrayList<>();
menuItems
를 탐색하면서 하나씩 접근합니다.public static void main(String[] args) {
// List 선언 및 초기화
// add 함수를 통해 new MenuItem(이름, 가격, 설명) List에 삽입
// Scanner 선언
// 반복문을 활용해 List 안에 있는 MenuItem을 하나씩 출력
// 숫자를 입력 받기
// 입력된 숫자에 따른 처리
// 프로그램을 종료
// 선택한 메뉴 : 이름, 가격, 설명
}
level 2는 Main클래스와 MenuItem클래스를 분리합니다.
햄버거 메뉴를 MenuItem클래스와 List를 통해 관리합니다.
private String burgerName;
private double price;
private String description;
MenuItem클래스의 속성을 이름과 가격 설명을 캡슐화하고,
public MenuItem ( String burgerName, double price, String description) {
this.burgerName = burgerName;
this.description = description;
this.price = price;
}
생성자에서는 매개변수의 선언을 해줍니다.
// 게터를 이용하여 버거이름, 가격, 설명 반환
public String getBurgerName() {
return burgerName;
}
public String getDescription() {
return description;
}
public double getPrice() {
return price;
}
기능에서는 게터를 이용하여 버거이름, 가격, 설명을 반환하였습니다.
그 다음 메뉴로 넘어가서 (level1의 틀을 그대로 사용)
List<MenuItem> menuItems = new ArrayList<>();
// 메뉴 항목 추가
menuItems.add(new MenuItem("ShackBurger ", 6.9, "토마토, 양상추, 쉑소스가 토핑 된 치즈버거 "));
menuItems.add(new MenuItem("SmokeShack ", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑 된 치즈버거 "));
menuItems.add(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑 된 치즈버거"));
menuItems.add(new MenuItem("Hamburger ", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거 "));
List를 선언을 해주고, 그 뒤에 메뉴에 대한 항목을 추가하였습니다.
System.out.println("[ SHAKESHACK MENU ]");
System.out.println("---------------------------------------------------------------------");
for (int i = 0; i < menuItems.size(); i++) {
MenuItem item = menuItems.get(i);
System.out.println("| " + (i +1) + ". " + item.getBurgerName() +
" | W" + item.getPrice() + " | " + item.getDescription() + " |");
System.out.println("---------------------------------------------------------------------");
}
level 1에서 메뉴를 System.out.println으로 하나하나 손으로 선언하였다면
for문을 사용하여 메뉴를 출력하였습니다. (이렇게 하면 메뉴가 늘어나도 손쉽게 메뉴판을 고칠 수 있습니다.)
System.out.println("| 0. 종료 | 종료 |");
System.out.println("---------------------------------------------------------------------");
while (true) {
System.out.print("번호를 입력하세요 : ");
answer = sc.nextInt();
if (answer >=0 && answer <= 4) {
break;
}
System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
}
} while (answer != 0 && (answer < 1 || answer > 4));
사용자에게 입력받는 값 또한 level 1과 동일하게 while문으로 answer값에 따라서 프로그램이 종료가 되거나 반복되게 만들었습니다.
if (answer != 0) {
MenuItem selectedItem = menuItems.get(answer - 1);
System.out.println("\n선택한 메뉴: " + selectedItem.getBurgerName());
System.out.println("가격: W" + selectedItem.getPrice());
System.out.println("설명: " + selectedItem.getDescription() + "\n");
}
하지만 조금 다른 점은 do-while문 밖에 메뉴를 설명해주는 것을 리스트로 받아서 설정해놨습니다.
main
함수에서 관리하던 전체 순서 제어를 Kiosk
클래스를 통해 관리합니다.Kiosk
클래스 생성하기MenuItem
을 관리하는 리스트가 필드로 존재합니다.main
함수에서 관리하던 입력과 반복문 로직은 이제 start
함수를 만들어 관리합니다.List<MenuItem> menuItems
는 Kiosk
클래스 생성자를 통해 값을 할당합니다.Kiosk
객체를 생성하고 사용하는 main
함수에서 객체를 생성할 때 값을 넘겨줍니다.0
을 입력하면 프로그램이 ‘뒤로가기’되거나 ‘종료’됩니다.level 3는 Kiosk 클래스를 생성하여 Main클래스에 있는 입출력과 반복문 로직을 옮기는 것입니다.
Main 클래스에는 이제 Kiosk의 start라는 함수만 호출시켜 실행을 시킵니다.
일단 Kiosk 클래스를 생성합니다. Kiosk 클래스에서 사용자의 입출력을 받아올 것이기에 Scanner을 선언해줍니다. 그 뒤에 level 2의 MenuItems의 리스트를 Kiosk로 옮겨줍니다.
Scanner sc = new Scanner(System.in);
// 속성
List<MenuItem> menuItems;
// 생성자
public Kiosk () {
menuItems = new ArrayList<>();
menuItems.add(new MenuItem("ShackBurger ", 6.9, "토마토, 양상추, 쉑소스가 토핑 된 치즈버거 "));
menuItems.add(new MenuItem("SmokeShack ", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑 된 치즈버거 "));
menuItems.add(new MenuItem("Cheeseburger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑 된 치즈버거"));
menuItems.add(new MenuItem("Hamburger ", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거 "));
}
속성에는 리스트 변수를 선언해주고 생성자에서 ArrayList로 설정합니다.
그 뒤에 menuItems 리스트에 햄버거 메뉴들을 추가해줍니다.
public void start () {
int answer;
do {
// 메뉴 출력
System.out.println("[ SHAKESHACK MENU ]");
System.out.println("---------------------------------------------------------------------");
for (int i = 0; i < menuItems.size(); i++) {
MenuItem item = menuItems.get(i);
System.out.println("| " + (i + 1) + ". " + item.getBurgerName() +
" | W" + item.getPrice() + " | " + item.getDescription() + " |");
System.out.println("---------------------------------------------------------------------");
}
System.out.println("| 0. 종료 | 종료 |");
System.out.println("---------------------------------------------------------------------");
while (true) {
System.out.print("번호를 입력하세요 : ");
answer = sc.nextInt();
if (answer >= 0 && answer <= 4) {
break;
}
System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
}
} while (answer != 0 && (answer < 1 || answer > 4));
if (answer != 0) {
MenuItem selectedItem = menuItems.get(answer - 1);
System.out.println("\n선택한 메뉴: " + selectedItem.getBurgerName());
System.out.println("가격: W" + selectedItem.getPrice());
System.out.println("설명: " + selectedItem.getDescription() + "\n");
}
System.out.println("프로그램을 종료합니다.");
sc.close();
}
Kiosk 클래스에 start라는 메소드를 생성해 Main클래스에 있었던 반복문들의 로직을 옮겨줍니다.
public class Main {
public static void main (String[] args) {
Kiosk kiosk = new Kiosk();
kiosk.start();
}
}
그러면 Main클래스는 이렇게 Kiosk 객체를 생성해주고 start함수를 호출해주는 코드만 남게됩니다.