- 의도한 연산 결과 : 사용자가 "exit"이라는 문자열을 입력할 때까지 대기
[1/2] 0 또는 양의 정수를 입력하세요 : 3
[2/2] 0 또는 양의 정수를 입력하세요 : 0
연산 부호를 입력하세요 (+, -, *, / 중 택1) : /
0으로 나눌 수 없습니다.
다시 계산하시겠습니까? 'exit' 를 입력하여 종료 :
- 실제 연산 결과 : 사용자의 입력을 기다리지 않고 다시 무한루프의 처음으로 회귀
[1/2] 0 또는 양의 정수를 입력하세요 : 3
[2/2] 0 또는 양의 정수를 입력하세요 : 0
연산 부호를 입력하세요 (+, -, *, / 중 택1) : /
0으로 나눌 수 없습니다.
다시 계산하시겠습니까? 'exit' 를 입력하여 종료 : [1/2] 0 또는 양의 정수를 입력하세요 :
- 소스 코드
package step1;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 2개의 양의 정수와 부호 입력받기
while(true){
System.out.print("[1/2] 0 또는 양의 정수를 입력하세요 : ");
int a = scanner.nextInt();
System.out.print("[2/2] 0 또는 양의 정수를 입력하세요 : ");
int b = scanner.nextInt();
System.out.print("연산 부호를 입력하세요 (+, -, *, / 중 택1) : ");
char op = scanner.next().charAt(0);
//입력받은 정수와 부호로 간단한 계산하기
int result;
switch(op) {
case '+':
result = a + b;
System.out.println("연산 결과 : " + result);
break;
case '-':
result = a - b;
System.out.println("연산 결과 : " + result);
break;
case '*':
result = a * b;
System.out.println("연산 결과 : " + result);
break;
case '/':
if(b == 0) {
System.out.println("0으로 나눌 수 없습니다.");
break;
}
result = a / b;
System.out.println("연산 결과 : " + result);
break;
default:
System.out.println("올바른 문자를 입력하세요.");
break;
}
System.out.print("다시 계산하시겠습니까? 'exit' 를 입력하여 종료 : ");
String response = scanner.nextLine();
if(response.equals("exit")){
System.out.println("계산기가 종료되었습니다.");
break;
}
}
} //main함수 종료
} //main 클래스 종료
- 원인 분석
자바에서 char형은 Scanner을 통해 바로 입력받을 수 없기 때문에, next()를 통해 string을 Scanner로 받은 다음, charAt(0)로 char형으로 바꿔주었다(0은 문자의 위치). 이 때 버퍼에는 엔터 \r\n가 남아있게 된다(핵심)
nextLine은 한줄 단위로 입력을 받는다. 즉 버퍼를 확인하여 \n이라는 개행 문자가 있으면 사용자의 입력을 기다리지 않고 즉시 읽어오게 된다. 앞에 next.charAt(0)으로 인해 버퍼에 \r\n이라는 개행문자가 남아있었으므로, response 변수에는 '\r\n'만 저장되고, if문을 통하지 않으므로 다시 무한루프의 처음으로 돌아가게 되는 것이다.
- 해결 방안
nextLine() 대신 next() 메서드를 사용하면 된다. next()는 개행 문자를 제외하고 버퍼에 있는 값을 읽어오는 스캐너 메서드이므로, 버퍼에 개행 문자가 있더라도 사용자의 문자열 입력을 반드시 기다리게 된다.
- 수정된 코드
package step1;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 2개의 양의 정수와 부호 입력받기
while(true){
System.out.print("[1/2] 0 또는 양의 정수를 입력하세요 : ");
int a = scanner.nextInt();
System.out.print("[2/2] 0 또는 양의 정수를 입력하세요 : ");
int b = scanner.nextInt();
System.out.print("연산 부호를 입력하세요 (+, -, *, / 중 택1) : ");
char op = scanner.next().charAt(0);
//입력받은 정수와 부호로 간단한 계산하기
int result;
switch(op) {
case '+':
result = a + b;
System.out.println("연산 결과 : " + result);
break;
case '-':
result = a - b;
System.out.println("연산 결과 : " + result);
break;
case '*':
result = a * b;
System.out.println("연산 결과 : " + result);
break;
case '/':
if(b == 0) {
System.out.println("0으로 나눌 수 없습니다.");
break;
}
result = a / b;
System.out.println("연산 결과 : " + result);
break;
default:
System.out.println("올바른 문자를 입력하세요.");
break;
}
System.out.print("다시 계산하시겠습니까? 'exit' 를 입력하여 종료 : ");
String response = scanner.next();
if(response.equals("exit")){
System.out.println("계산기가 종료되었습니다.");
break;
}
}
} //main함수 종료
} //main 클래스 종료
출처
https://devlog-wjdrbs96.tistory.com/80
[JAVA] next(), nextLine() 의 차이
나는 지금까지 next()와 nextLine()의 차이는 단순히 한 줄을 전부 입력받고 싶을 때(한 문장을 입력한다던지)는 nextLine()을 사용하고 한 단어씩 입력하고자 할 때는 next()를 사용한다 정도의 가볍게
devlog-wjdrbs96.tistory.com
'ETC > 1. Today I Learned' 카테고리의 다른 글
| [Java] 스레드, Runnable, join() (1) | 2025.12.12 |
|---|---|
| [Git 기초] Fork & Clone, Fetch & Pull 배워보기 (0) | 2025.12.11 |
| [Java] 예외 처리 (Exception) (0) | 2025.12.05 |
| [Git 기초] 이미 push한 커밋 메시지 변경하기 (0) | 2025.12.04 |
| [Git 기초] 원격 저장소가 확인되지 않을 때 대처법 (0) | 2025.12.03 |