exit를 입력받으면, 프로그램이 종료됩니다. 라는 문장을 출력하고 더 이상의 코드 진행이 없도록 하고 싶어서
String i = sc.nextLine();
... else if (Objects.equals(i, "exit") ) {
System.out.println("프로그램 종료");
}
이렇게 코드를 작성했다.
그런데 ,,
원하는대로 종료가 되기는 하는데 ,,, 내가 출력하려고 써놨던 문장은 출력이 안되고, 왜 ... For input string: "exit" 이 뜨는걸까 ?
혹시 다른 조건문에도 이런 경우가 발생하나 싶어 실행해봤더니, 원하는 대로 실행되지 않고 종료되어버렸다.
다른 코드에서 조건을 줄 때, 두 가지의 조건을 주고자,
String i = sc.nextLine();
if (Integer.parseInt(i) == 1 || Objects.equals(i, "Coffee")) {
detailMenu("Coffee", coffeeList);
} ...
이렇게 작성했는데, 혹시 조건의 순서가 잘못되었나 싶어서 순서를 바꿔서 실행했더니 잘 되었다.
String i = sc.nextLine();
if (Objects.equals(i, "Coffee") || Integer.parseInt(i) == 1) {
detailMenu("Coffee", coffeeList);
} ...
다른 메뉴들은 잘 실행이 되는데, exit를 입력하는 경우에만 !!
그 경우에만 내가 작성해놓은 문장이 출력되지 않고, For input String: ..이 뜬다 ..
다시 실행해보니, 내가 조건에 적어놓은 ("exit" 제외) 하고 그 외의 문자열의 값을 입력해도 적어놓은 문장이 출력되지 않고 For input String: .. 이 뜨는 것을 확인할 수 있었다.
메뉴 명을 숫자로 바꿔주었더니 실행은 가능해졌다.
String i = sc.nextLine();
... else if (Objects.equals(i, "00") ) {
System.out.println("프로그램 종료");
}
하지만 내가 원한 것은 이게 아니다 .. 다른 문자열을 입력받았을 때도 동일하게 실행되길 바란건데,, 다른 메뉴들처럼 조건을 2개씩 넣어주면 가능한걸까?
String i = sc.nextLine();
... else if (Objects.equals(i, "종료") || Integer.parseInt(i) == 00) {
System.out.println("프로그램 종료");
}
그래도 되지 않는다..
왜 내가 작성해놓은 코드가 출력이 되지 않는걸까 ..
CY 스승님의 도움으로 해결했다 ..
내가 console 본 그 For input String: "문자열" 이 문구가 예외 문구 였던 것 같다.
애초에 문자열 하나를 입력받고, 그걸 문자열로도, Integer 타입으로도 비교하려고 하니 되지 않았었던 거였다.
바보같은 나의 모습 ..
해결가능한 방법은 두 가지이다
1) 문자열로만 비교하기
String i = sc.nextLine();
if (Objects.equals(i, "1") || Objects.equals(i, "Coffee")) {
detailMenu("Coffee", coffeeList);
} ...
이런식으로 숫자를 입력받아도 String 타입으로 인식하기 때문에, 문자열끼리 비교해주는 조건으로 변경한다.
2) 예외 처리 해주기
String i = sc.nextLine();
Integer num = null;
try {
num = Integer.valueOf(i);
} catch (Exception e) {
// 예외 문구는 굳이 출력하지 않았다
}
... else if (num == -1 || Objects.equals(i, "종료")) {
System.out.println("프로그램을 종료합니다.");
}
이렇게 모든 조건을 변경해주면, 문자열로 입력받아서 Integer 타입으로 변경이 불가능한 경우에도 예외가 발생하지 않고 잘 실행되는 모습을 확인할 수 있었다.
내 쪽에서 실행할 때는 별다른 오류가 발생하지 않아서, 작성한 조건에 오류가 없다고 생각했는데, 애초에 저렇게 조건을 작성해서 사용할 수가 없는 것이었다.
문자열로 입력을 받은 경우, 숫자로 입력을 받은 경우 모두 비교를 하고 싶었기 때문에 조건을 두 가지로 나누어 작성했다.
이런 경우, 어차피 문자열 타입으로 입력을 받기 때문에 비교 자체도 전부 문자열로 하던지, 예외 처리를 필수적으로 해서 사용해야 한다.
피드백 받은 내용을 바탕으로 개인 과제 내용을 조금 수정했다.
먼저 Menu.java와 그를 상속받는 Goods.java 클래스가 있다.
Menu.java
private String Number, Name, Detail;
public String getNumber() { return this.Number; }
public String getName() { return this.Name; }
public String getDetail() { return this.Detail; }
Menu.java에는 세 개의 String 타입의 필드와 각각의 필드에 접근 가능한 getter 메소드가 존재한다.
Goods.java (extends Menu.java)
private Double price;
@Override
public String getNumber() { return super.getNumber(); }
@Override
public String getName() { return super.getName(); }
@Override
public String getDetail() { return super.getDetail(); }
public Double getPrice() { return this.price; }
이런 형태로 작성해놓고 사용했었다.
하지만 내용을 잘 읽어보면, Goods.java에서 getter중 3개는 부모의 getter를 그대로 사용한 것으로, Override 해서 수정한 내용이 없다. 즉 그대로 사용 가능하기 때문에 굳이 메소드를 만들어 주지 않아도 되었던 것이다.
그래서 @Override 한 저 세개의 getter 메소드를 지웠다.
Goods.java
private double price; // Small 메뉴의 가격
private double price2; // Regular 메뉴의 가격
private int number; // Small 메뉴의 개수
private int number2; // Regular 메뉴의 개수
private int number_total = 0; // Small 메뉴의 총 개수
private int number2_total = 0; // Regular 메뉴의 총 개수
음료가 Regular 사이즈인 경우에는, 원래 쓰던 필드명에 2를 붙여서 사용했다.
코드를 내가 작성했기 때문에 나는 필드명이 어떤 것을 의미하는지 바로 파악할 수 있지만, 코드를 처음 보는 사람들은 주석이 없는 경우 이해하기 어려운 필드명이기 때문에 수정이 필요하다.
private double price; // Small 메뉴의 가격
private double priceR; // Regular 메뉴의 가격
private int number; // Small 메뉴의 개수
private int numberR; // Regular 메뉴의 개수
private int number_total = 0; // Small 메뉴의 총 개수
private int numberR_total = 0; // Regular 메뉴의 총 개수
따라서 Regular 사이즈에 해당하는 필드명에는 2가 아닌 R을 붙이는 것으로 변경했다.
확실히 그냥 2가 붙어있는 경우보다 이해하기 쉬운 것 같았다.