| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- java
- sql #내일배움캠프 #스파르타코딩클럽
- java #문법
- html #css #부트스트랩 #웹사이트 #개발 #초보 #til #내일배움캠프 #스파르타코딩클럽
- sql #부트캠프 #내일배움캠프 #웹관리자 #도전 #학습
- Today
- Total
Hyeok의 웹 개발 블로그
<2025.03.13> 키오스크 과제 Lv4 and Lv5 본문
💡 키오스크 과제 Lv4 , Lv 5 를 구현해보았습니다.
조건
▷ Lv 4
- Menu 클래스 생성하기
- MenumItem 클래스를 관리하는 클래스
- List<MenuItem> 은 Kiosk 클래스가 관리하기에 적절하지 않으므로 Menu 클래스가 관리하도록 변경
- 여러 버거들을 포함하는 상위 개념 '버거' 같은 카테고리 이름 필드 생성
- 메뉴 카테고리 이름을 반환하는 메서드를 구현
▷ Lv 5
- MenuItem, Menu 그리고 Kiosk 클래스의 필드에 직접 접근하지 못하도록 설정
- Getter, Setter 메서드를 사용해 데이터를 관리
🎈 Menu 클래스를 생성합니다.
Kiosk 클래스가 관리하던 List<MenuItem>을 Menu 클래스로 변경합니다.
public class Menu {
List<MenuItem> menuItems;
Menu() {
menuItems = new ArrayList<>(); // menuItem 리스트를 초기화 시킨다. (초기화 하지않고 실행 했더니 오류가 발생)
menuItems.add(new MenuItem("ShackBuger", 6.9, "토마토, 양상추, 쉑소스가 토핑된 치즈버거"));
menuItems.add(new MenuItem("SmokeShack", 8.9, "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거"));
menuItems.add(new MenuItem("Cheesebuger", 6.9, "포테이토 번과 비프패티, 치즈가 토핑된 치즈버거"));
menuItems.add(new MenuItem("Hamburger", 5.4, "비프패티를 기반으로 야채가 들어간 기본버거"));
그리고 여기서 상위 카테고리인 MenuCategory 를 구현해줍니다.
List<String> menuCategory;
menuCategory = new ArrayList<>(); // menuCategory 리스트를 초기화 시킨다.
menuCategory.add("Burgers");
menuCategory.add("Drinks");
menuCategory.add("Desserts");
그리고 메뉴 카테고리 이름을 메서드를 구현해 return 값으로 반환해줍니다.
List<MenuItem> getMenuItems(){
return this.menuItems;
}
List<String> getMenuCategory(){
return this.menuCategory;
}
그리고 Kiosk 클래스로 넘어가 새로만든 상위 카테고리를 실행시키기 위해 start 함수 매서드에 구현을 해줍니다.
while 문 안쪽 상단에 구현을 해주었습니다.
for 문을 사용해서 List를 활용해 작성을 해주었습니다.
System.out.println(" ");
System.out.println("[ MAIN MENU ]");
List<String> category = menu.getMenuCategory();
for (int i = 0; i < category.size(); i++) {
System.out.println((i + 1) + ". " + category.get(i));
}
그리고 버거 메뉴도 새롭게 작성했습니다.
if (number1 == 1) {
System.out.println(" ");
System.out.println("[ BURGERS MENU ]");
List<MenuItem> burgers = menu.getMenuItems();
for (int i = 0; i < burgers.size(); i++) {
System.out.println((i + 1) + ". " + burgers.get(i).getName() + " | W " + burgers.get(i).getPrice() + " | " + burgers.get(i).getDescription());
}
System.out.println("0. 종료 | 종료");
그리고 마지막 버거 메뉴를 선택 하기 위해 switch문을 사용했고, number2를 입력해 구현했습니다.
switch (number2) {
case 1:
System.out.println("선택한 메뉴 : " + burgers.get(0).getName() + " | W " + burgers.get(0).getPrice() + " | " + burgers.get(0).getDescription());
// menuItem.get(0); 으로만 해서 soutv 했을땐, kiosk_lv2.lv2.MenuItem@52cc8049 와 같이 나왔음. >> @~~~ 주소를 나타낸다.
break;
case 2:
System.out.println("선택한 메뉴 : " + burgers.get(1).getName() + " | W " + burgers.get(1).getPrice() + " | " + burgers.get(1).getDescription());
break;
case 3:
System.out.println("선택한 메뉴 : " + burgers.get(2).getName() + " | W " + burgers.get(2).getPrice() + " | " + burgers.get(2).getDescription());
break;
case 4:
System.out.println("선택한 메뉴 : " + burgers.get(3).getName() + " | W " + burgers.get(3).getPrice() + " | " + burgers.get(3).getDescription());
break;
}
if (number2 == 0) {
System.out.println("주문을 종료합니다.");
break;
그리고 Main 클래스에 kiosk 메서드 start를 가져와 실행했습니다.
public class Main {
public static void main(String[] args) {
Menu menu = new Menu();
List<MenuItem> menuItems = new ArrayList<>();
Kiosk kiosk = new Kiosk();
kiosk.start();
}
}
🎈 Menu 클래스에 캡슐화를 진행해줬습니다.
public 으로 지정되어있던 내용을 private로 변경했습니다.
public class Menu {
private List<MenuItem> menuItems;
private List<String> menuCategory;
private List<MenuItem> drinkMenu = new ArrayList<>();
private List<MenuItem> dessertsMenu = new ArrayList<>();
그리고 게터를 사용해줬습니다.
List<MenuItem> getMenuItems(){
return this.menuItems;
}
List<String> getMenuCategory(){
return this.menuCategory;
}
List<MenuItem> getDessertsMenu(){
return this.dessertsMenu;
}
List<MenuItem> getDrinkMenu(){
return this.drinkMenu;
}
그리고 캡슐화를 진행하며, 상위 카테고리에 공백으로 존재하던 Drink 와 Dessert 부분에 메뉴를 생성했습니다.
drinkMenu = new ArrayList<>();
drinkMenu.add(new MenuItem("Coke", 1.5,"콜라"));
drinkMenu.add(new MenuItem("Sprite", 1.5, "스프라이트"));
drinkMenu.add(new MenuItem("Fanta",1.5,"환타"));
drinkMenu.add(new MenuItem("MountainDew",1.5,"마운틴듀"));
dessertsMenu = new ArrayList<>();
dessertsMenu.add(new MenuItem("IceCream",2.0,"소프트콘"));
dessertsMenu.add(new MenuItem("OnionRing",3.0,"달달한 어니언링(5개입)"));
dessertsMenu.add(new MenuItem("Cookie",3.0,"촉촉한 쿠키(5개입)"));
dessertsMenu.add(new MenuItem("ChickenNugget",4.0,"바삭한 치킨너겟(6개입)"));
MenuItem 클래스 또한 같은 작업을 진행했습니다.
private String name;
private double price;
private String description;
String getName(){
return this.name; // 이전에 getName으로 구현하고 오류가남! main 클래스에서 무한 반복이 발생 >> getName , name 부분을 반복
}
double getPrice(){
return this.price;
}
String getDescription(){
return this.description;
}
}
그리고 Kiosk 클래스에 새롭게 추가한 Drink 와 Dessert 메뉴에 대한 내용도 구현하였습니다.
List<MenuItem> drinks = menu.getDrinkMenu();
List<MenuItem> desserts = menu.getDessertsMenu();
if (number == 1) {
System.out.println(" ");
System.out.println("[ BURGERS MENU ]");
for (int i = 0; i < burgers.size(); i++) {
System.out.println((i + 1) + ". " + burgers.get(i).getName() + " | W " + burgers.get(i).getPrice() + " | " + burgers.get(i).getDescription());
}
System.out.println("0. 뒤로가기");
int menuNumber = scanner.nextInt();
scanner.nextLine();
if (menuNumber >= 1 && menuNumber <= burgers.size()) {
System.out.println("선택한 메뉴 : " + burgers.get(menuNumber - 1).getName() + " | W " + burgers.get(menuNumber - 1).getPrice() + " | " + burgers.get(menuNumber - 1).getDescription());
}
else if (number == 2) {
System.out.println(" ");
System.out.println("[ DRINK MENU ]");
for (int i = 0; i < drinks.size(); i++) {
System.out.println((i + 1) + ". " + drinks.get(i).getName() + " | W " + drinks.get(i).getPrice() + " | " + drinks.get(i).getDescription());
}
System.out.println("0. 뒤로가기");
int menuNumber = scanner.nextInt();
scanner.nextLine();
if (menuNumber >= 1 && menuNumber <= drinks.size()) {
System.out.println("선택한 메뉴 : " + drinks.get(menuNumber - 1).getName() + " | W " + drinks.get(menuNumber - 1).getPrice() + " | " + drinks.get(menuNumber - 1).getDescription());
}
else if (number == 3) {
System.out.println(" ");
System.out.println("[ DESSERT MENU ]");
for (int i = 0; i < desserts.size(); i++) {
System.out.println((i + 1) + ". " + desserts.get(i).getName() + " | W " + desserts.get(i).getPrice() + " | " + desserts.get(i).getDescription());
}
System.out.println("0. 뒤로가기");
int menuNumber = scanner.nextInt();
scanner.nextLine();
if (menuNumber >= 1 && menuNumber <= desserts.size()) {
System.out.println("선택한 메뉴 : " + desserts.get(menuNumber - 1).getName() + " | W " + desserts.get(menuNumber - 1).getPrice() + " | " + desserts.get(menuNumber - 1).getDescription());
}
switch문을 사용해 메뉴를 선택하고있었지만, else - if 문으로 변경하여 구현했습니다.
그리고 Main 클래스에서 kiosk.start 로 실행해주었습니다.
public class Main {
public static void main(String[] args) {
Menu menu = new Menu();
List<MenuItem> menuItems = new ArrayList<>();
Kiosk kiosk = new Kiosk();
kiosk.start();
}
}
📌 트러블 슈팅
- Lv 4를 구현 하던 중, Menu 클래스에 menuItem = new ArrayList<>(); 를 작성하지않고 실행을 시켰었습니다.
그러니, 값이 표현되지않는 오류가 발생했습니다.
그래서 여러가지 방법을 시도해보고 찾아본 결과, menuItem = new ArrayList<>(); 문장을 작성하지 않아 발생한다는 것을 알게 되었습니다. menuItem 리스트를 초기화 시키고 실행시켜야 오류가 발생 하지 않는 사실을 알게되어
초기화를 시키고 다시 구현해 보았더니, 정상적으로 실행되는 것을 확인할 수 있었습니다.
- 그리고 Lv3 에서 Lv4 로 넘어오면서 작업을 할 때, 새로운 카테고리를 생성하고 Kiosk 클래스가 가지고있던 MenuItem 클래스의 내용을 Menu클래스로 넘겨오는 과정에서 어려움을 느꼈습니다.
코드가 정리가 되지 않고 복잡했지만, 코드를 처음부터 천천히 작성해서 해결할 수 있었습니다.
- Kiosk 클래스를 구현할 때, 조건 중
1. Menu가 가진 List<MenuItem>을 반복문을 활용하여 햄버거 메뉴 출력
2. [입력 받은 숫자가 올바르다면 인덱스로 활용해서 Menu가 가지고 있는 List<MenuItem>에 접근하기
// menu.getMenuItems().get(i); 같은 형식으로 하나씩 들어가서 얻어와야 합니다.]
라는 조건에 맞춰 작성을 하였는데, 어떠한 형식으로 작성을 해야 하는지에 대한 어려움이 있었습니다.
그래서 이전 강의 내용 자료를 찾아보며 복습을 진행했고, 질의응답을 통해 해결할 수 있었습니다.
for (int i = 0; i < category.size(); i++) {
System.out.println((i + 1) + ". " + category.get(i));
}
if (number1 == 1) {
System.out.println(" ");
System.out.println("[ BURGERS MENU ]");
List<MenuItem> burgers = menu.getMenuItems();
for (int i = 0; i < burgers.size(); i++) {
System.out.println((i + 1) + ". " + burgers.get(i).getName() + " | W " + burgers.get(i).getPrice() + " | " + burgers.get(i).getDescription());
}
System.out.println("0. 종료 | 종료");
System.out.println("선택한 메뉴 : " + burgers.get(0).getName() + " | W " + burgers.get(0).getPrice() + " | " + burgers.get(0).getDescription());
- Lv 5 구현 중 dirnks 와 desserts 를 새롭게 구현할 때, switch문을 여러개 사용해서 작성하는 것은 불필요한 작업이라 생각을 했습니다. 지금은 내용이 적어 작성은 할 수있지만, 만약 메뉴 카테고리가 더 많아진다면 switch 문을 활용하는 것이 효율적이지 않다라고 생각하여 if 문을 활용했습니다.
처음에는 하단에 새롭게 if 문 작성해서 했습니다.
그렇게 진행했더니 scanner 값인 menuNumber 이 정상 작동하지 않는 오류 ( drink 카테고리에 들어가서 coke 를 선택해도 burger에 대한 값이 출력되는 오류가 발생) 와 else if 문으로 작동했을 때는 2번을 선택하면 2번을 포함한 3 , 4 번의 메뉴도 출력되는 오류가 발생했습니다.
> 그래서 menuNumber 1 , menuNumber 2 를 지정해서 하면 해결되지않을까? 라는 생각을 가지고 진행을 해봤지만 해결이 되지않았습니다. 그리고 여러개의 menuNumber를 지정할 필요가 없다라고 판단을 했습니다.
> 다음으로는 if 문이 아닌 else-if를 사용해야하는 건 아닐까? 라고 생각해 작성해보았지만 해결되지 않았습니다.
여러가지 방법을 시도해보고 무엇이 문제인지 생각했을 때, 코드의 순서에 문제가 있는건 아닐까라는 생각을 했고
if (number == 1) {
System.out.println(" ");
System.out.println("[ BURGERS MENU ]");
for (int i = 0; i < burgers.size(); i++) {
System.out.println((i + 1) + ". " + burgers.get(i).getName() + " | W " + burgers.get(i).getPrice() + " | " + burgers.get(i).getDescription());
}
System.out.println("0. 뒤로가기");
int menuNumber = scanner.nextInt();
scanner.nextLine();
if (menuNumber >= 1 && menuNumber <= burgers.size()) {
System.out.println("선택한 메뉴 : " + burgers.get(menuNumber - 1).getName() + " | W " + burgers.get(menuNumber - 1).getPrice() + " | " + burgers.get(menuNumber - 1).getDescription());
}
} else if (number == 2) {
System.out.println(" ");
System.out.println("[ DRINK MENU ]");
for (int i = 0; i < drinks.size(); i++) {
System.out.println((i + 1) + ". " + drinks.get(i).getName() + " | W " + drinks.get(i).getPrice() + " | " + drinks.get(i).getDescription());
}
System.out.println("0. 뒤로가기");
int menuNumber = scanner.nextInt();
scanner.nextLine();
if (menuNumber >= 1 && menuNumber <= drinks.size()) {
System.out.println("선택한 메뉴 : " + drinks.get(menuNumber - 1).getName() + " | W " + drinks.get(menuNumber - 1).getPrice() + " | " + drinks.get(menuNumber - 1).getDescription());
}
이와같은 순서의 코드를 작성하여 오류를 해결할 수 있었습니다.
'TIL > Java' 카테고리의 다른 글
| <2025.03.12> ENUM, 동등성과 동일성 (0) | 2025.03.12 |
|---|---|
| <2025.03.11> 키오스크 과제 Lv 3 (0) | 2025.03.11 |
| <2025.03.10> 키오스크 과제 Lv2 (0) | 2025.03.10 |
| <2025.03.07> 키오스트 과제 Lv1 (0) | 2025.03.07 |
| <2025.03.06>Java 챕터 [3-1] ~[3~3] (0) | 2025.03.06 |