[문제]
package com.project.personal.calculator;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("첫 번째 숫자를 입력해 주세요: ");
int numFirst = sc.nextInt();
System.out.print("사칙연산 기호(+, -, *, /) 중 하나를 입력해 주세요: ");
String operator = sc.nextLine();
// [원인 추측] print 대신 println이라고 해야 했나?
System.out.print("두 번째 숫자를 입력해 주세요: ");
int numSecond = sc.nextInt();
Calculator test = new Calculator();
String outcome = Integer.toString(test.calculate(numFirst, operator, numSecond));
System.out.println("연산한 결과는 "+outcome+"입니다.");
}
}
이제는 Scanner 클래스를 자연스럽게 쓴다고 속으로 흥얼거리기도 잠시, 사칙 연산을 입력해야 할 곳 옆에 두 번째 숫자를 입력해 달라는 문장이 출력되었다. 처음에는 print() 메서드 때문인 줄 알고 println() 메서드로 수정한 다음 다시 프로그램을 실행했다.
[추측]
package com.project.personal.calculator;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("첫 번째 숫자를 입력해 주세요: ");
int numFirst = sc.nextInt();
System.out.println("사칙연산 기호(+, -, *, /) 중 하나를 입력해 주세요: ");
String operator = sc.nextLine();
// [수정 전] print
// [수정 후] println
// [수정 결과] 문제가 해결되지 않음
System.out.print("두 번째 숫자를 입력해 주세요: ");
int numSecond = sc.nextInt();
Calculator test = new Calculator();
String outcome = Integer.toString(test.calculate(numFirst, operator, numSecond));
System.out.println("연산한 결과는 "+outcome+"입니다.");
}
}
추측은 보기 좋게 틀렸다. 3434를 입력하니 '사칙연산 기호(+. -, *, /) 중 하나를 입력해 주세요: ' 문장과 '두 번째 숫자를 입력해 주세요: ' 문장이 동시에 출력되었다. 두 문장이 한 줄에 나오느냐 아니냐 외에는 문제가 해결되지 않았다. 튜터님을 또 다시 찾아간 뒤에야 진짜 원인을 찾을 수 있었다.
[원인]
package com.project.personal.calculator;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("첫 번째 숫자를 입력해 주세요: ");
int numFirst = sc.nextInt();
System.out.print("사칙연산 기호(+, -, *, /) 중 하나를 입력해 주세요: ");
String operator = sc.next();
// [오답] sc.nextLine();
// [정답] sc.next();
System.out.print("두 번째 숫자를 입력해 주세요: ");
int numSecond = sc.nextInt();
Calculator test = new Calculator();
String outcome = Integer.toString(test.calculate(numFirst, operator, numSecond));
System.out.println("연산한 결과는 "+outcome+"입니다.");
}
}
원인은 nextLine()과 next()를 정확히 모르는 데 있었다. nextLine()은 '별도로 값을 받지 않고 다음 줄을 받겠다'를 의미했다. 계산기에서는 사칙연산 기호라는 문자열을 받아야 했으므로, next()를 써야 했다.
만약 무엇을 써야 하는지 헷갈린다면 next를 입력할 시 정말 메서드가 나오므로 상황에 맞게 골라 쓰면 되었다.
[해결]
package com.project.personal.calculator;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("첫 번째 숫자를 입력해 주세요: ");
int numFirst = sc.nextInt();
System.out.print("사칙연산 기호(+, -, *, /) 중 하나를 입력해 주세요: ");
String operator = sc.next();
// 입력받으려는 값이 문자열(String)이므로 next()메서드를 썼다.
System.out.print("두 번째 숫자를 입력해 주세요: ");
int numSecond = sc.nextInt();
Calculator test = new Calculator();
String outcome = Integer.toString(test.calculate(numFirst, operator, numSecond));
System.out.println("연산한 결과는 "+outcome+"입니다.");
}
}
다행히 Calculator 클래스로 생성한 test 객체는 잘 작동했다. 겸사겸사 어제 사과를 여러 개 만들면서 사용한 Integer.toString() 메서드도 함께 사용했다.
'Troubleshooting: 무엇이 문제였는가? > 본캠프 2주 차: 계산기 만들기' 카테고리의 다른 글
2단계: "반복문 안에서 인스턴스화를 했다고요? 갑부시군요!" (0) | 2024.11.24 |
---|---|
2단계: 절차 지향 add() vs 객체 지향 add() (0) | 2024.11.20 |
2단계: 반환타입이 int라서 return "문자열"이 불가능할 때 (0) | 2024.11.19 |
2단계: 비교 연산자(==) vs equals() (0) | 2024.11.19 |