[문제]
package com.example.kiosk.level4;
// 메인(main)
import java.util.*;
public class KioskLvFour {
public static void main(String[] args) {
System.out.println();
System.out.println("[MAIN MENU]");
List<Menu> allMenus = new ArrayList<>();
Menu menuBurger = new Menu("Burgers", new ArrayList<>());
Menu menuDrink = new Menu("Drinks", new ArrayList<>());
Menu menuSide = new Menu("Sides", new ArrayList<>());
menuBurger.menuItemList.add(0, new MenuItem("B1", 4.0, "불고기버거"));
menuBurger.menuItemList.add(1, new MenuItem("B2", 4.5, "치킨버거"));
menuBurger.menuItemList.add(2, new MenuItem("B3", 3.5, "새우버거"));
menuDrink.menuItemList.add(0, new MenuItem("D1", 2.5, "에이드"));
menuDrink.menuItemList.add(1, new MenuItem("D2", 1.5, "탄산수"));
menuSide.menuItemList.add(0, new MenuItem("S1", 6.0, "치즈스틱"));
Collections.addAll(allMenus, menuBurger, menuDrink, menuSide);
Kiosk kiosk = new Kiosk(allMenus);
kiosk.start();
// [원인 추측] start() 메서드에 원인이 있는 듯하다.
}
}
package com.example.kiosk.level4;
// Kiosk 클래스
import java.util.*;
public class Kiosk {
Scanner sc = new Scanner(System.in);
List<Menu> list;
public Kiosk(List<Menu> listName) {
this.list = listName;
}
public void start() {
for (int i = 0; i < this.list.size(); i++) {
int menuNumber = i + 1;
String menuName = this.list.get(i).menuName;
System.out.println(menuNumber + ". " + menuName);
}
System.out.println("0. 종료 | 종료");
System.out.println();
System.out.print("[MAIN MENU]에서 원하는 메뉴를 골라주세요. 0을 누르면 프로그램이 종료됩니다: ");
int inputNumber = sc.nextInt();
if (inputNumber == 0) {
System.out.println("0을 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else if (inputNumber > this.list.size()) {
System.out.println("[MAIN MENU]에 없는 번호를 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else {
int j = inputNumber - 1;
this.list.get(j).displayAllMenuItems();
}
System.out.println();
System.out.print("원하는 메뉴의 번호를 입력해 주세요. 0을 누르면 프로그램이 종료됩니다: ");
inputNumber = sc.nextInt();
if (inputNumber == 0) {
System.out.println("0을 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else if (inputNumber > this.list.get(inputNumber - 1).menuItemList.size()) {
// [원인 추측] 'inputNumber - 1' 부분이 문제인 듯하다.
System.out.println("메뉴에 없는 번호를 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else {
System.out.println("사용자가 선택한 MenuItem이 출력될 부분으로, 현재 구현 중입니다.");
}
}
}
get() 메서드에 어떤 인덱스(index)를 넣어야 올바른지 늘 헷갈렸기 때문에 3번 버거가 있는데도 의도와 다르게 프로그램 종료가 실행되었을 때 놀라지는 않았다. 우선 익숙해질 겸 한번 디버깅(debugging)을 했다.
[원인 추측]
트러블슈팅(Troubleshooting)을 작성하는 지금도 어떻게 원인과 해결법을 함께 찾았는지는 모르지만, 'size = 3' 부분을 본 순간 의문이 들었다.
'사용자가 1번 버거를 고르든 3번 버거를 고르든 Burgers라는 사실은 변하지 않는데, 왜 인덱스(index)를 다르게 넣었지? 게다가 변수 int j를 else문 안에 넣어서 else문 바깥에서 j를 써도 적용이 안 되지 않나?'
package com.example.kiosk.level4;
// Kiosk 클래스
import java.util.*;
public class Kiosk {
Scanner sc = new Scanner(System.in);
List<Menu> list;
public Kiosk(List<Menu> listName) {
this.list = listName;
}
public void start() {
for (int i = 0; i < this.list.size(); i++) {
int menuNumber = i + 1;
String menuName = this.list.get(i).menuName;
System.out.println(menuNumber + ". " + menuName);
}
System.out.println("0. 종료 | 종료");
System.out.println();
System.out.print("[MAIN MENU]에서 원하는 메뉴를 골라주세요. 0을 누르면 프로그램이 종료됩니다: ");
int inputNumber = sc.nextInt();
if (inputNumber == 0) {
System.out.println("0을 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else if (inputNumber > this.list.size()) {
System.out.println("[MAIN MENU]에 없는 번호를 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else {
int j = inputNumber - 1;
this.list.get(j).displayAllMenuItems();
// [정답] 정수형 int 타입 변수 j를 else문 바깥으로 빼야 했다.
}
System.out.println();
System.out.print("원하는 메뉴의 번호를 입력해 주세요. 0을 누르면 프로그램이 종료됩니다: ");
inputNumber = sc.nextInt();
if (inputNumber == 0) {
System.out.println("0을 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else if (inputNumber > this.list.get(inputNumber - 1).menuItemList.size()) {
// [오답] inputNumber - 1
// [정답] 'this.list.get(j).displayAllMenuItems();'에 있는 j
System.out.println("메뉴에 없는 번호를 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else {
System.out.println("사용자가 선택한 MenuItem이 출력될 부분으로, 현재 구현 중입니다.");
}
}
}
의구심이 들고 나니 '원인 같다'는 직감은 '원인이 맞다'는 확신으로 바뀌어 굳었다. 원인을 찾고 난 다음에는 눈길이 저절로 위쪽으로 향했고, 앞서 get() 메서드의 인덱스(index)로 사용한 정수형 int 타입 변수 j를 쓰면 되겠다는 생각이 그 뒤를 따랐다.
[해결]
인텔리제이(IntelliJ)는 친절하게도 내가 냅다 j를 넣어버리자 바로 빨간 전구를 반짝이며 다양한 해결법을 제시해 주었다. 사실 어떤 방법이 있나 확인하고 싶어서 '일단 쓰고 봐!' 심산으로 j를 쓰긴 했다. 나는 이 중에서 'Bring 'int j' into scope' 방법을 골라 아래와 같이 해결했다.
package com.example.kiosk.level4;
// Kiosk 클래스
import java.util.*;
public class Kiosk {
Scanner sc = new Scanner(System.in);
List<Menu> list;
public Kiosk(List<Menu> listName) {
this.list = listName;
}
public void start() {
for (int i = 0; i < this.list.size(); i++) {
int menuNumber = i + 1;
String menuName = this.list.get(i).menuName;
System.out.println(menuNumber + ". " + menuName);
}
System.out.println("0. 종료 | 종료");
System.out.println();
System.out.print("[MAIN MENU]에서 원하는 메뉴를 골라주세요. 0을 누르면 프로그램이 종료됩니다: ");
int inputNumber = sc.nextInt();
int j = inputNumber - 1;
/*
[수정 전] 없었음
[수정 후] 정수형 int 타입 변수 j 선언 및 초기화
즉 'int j = inputNumber - 1;' 입력함
*/
if (inputNumber == 0) {
System.out.println("0을 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else if (inputNumber > this.list.size()) {
System.out.println("[MAIN MENU]에 없는 번호를 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else {
this.list.get(j).displayAllMenuItems();
// [수정 전] 존재한 부분: int j = inputNumber - 1;
// [수정 후] else문 바깥에서 선언 및 초기화 했으므로 삭제
}
System.out.println();
System.out.print("원하는 메뉴의 번호를 입력해 주세요. 0을 누르면 프로그램이 종료됩니다: ");
inputNumber = sc.nextInt();
if (inputNumber == 0) {
System.out.println("0을 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else if (inputNumber > this.list.get(j).menuItemList.size()) {
/*
[수정 전] this.list.get(inputNumber - 1)
[수정 후] this.list.get(j)
*/
System.out.println("메뉴에 없는 번호를 입력하셨습니다. 프로그램을 종료합니다.");
System.exit(0);
} else {
System.out.println("사용자가 선택한 MenuItem이 출력될 부분으로, 현재 구현 중입니다.");
}
}
}
이 문제는 밤에 마주한 탓에 시간상 튜터님께 질문하기도 어려웠으나, 스스로 원인을 추측하고 찾아내서 해결했기에 더 특별하게 다가왔다. 자고 싶은 마음보다 문제를 해결한 당일에 기록해 두고 싶은 마음이 훨씬 컸다. 문제 해결 능력이 이전보다 조금은 커졌다고 뿌듯해해도 좋지 않을까.
'Troubleshooting: 무엇이 문제였는가? > 본캠프 2주 차: 키오스크 만들기' 카테고리의 다른 글
3단계: "Variable 'menuItems' initializer 'new ArrayList<>()' is redundant" (0) | 2024.11.25 |
---|---|
3단계: "Field can be converted to a local variable" (0) | 2024.11.25 |
3단계: "아이고, 믿는 sout에 발등 찍힌다더니!" (0) | 2024.11.25 |
2단계: "숫자를 아무리 더해도 1만 나올 때 심정이란?" (0) | 2024.11.24 |
1단계: "반복문 밖에서 변수를 선언했더니 햄버거가 비처럼 내리네!" (0) | 2024.11.24 |