입력의 끝을 확인하는 문제_계산기 만들기
1. 프로그램
숫자와 연산자를 연속적으로 입력받아 계산하고 계산 결과를 출력하는 프로그램
2. 문제 상황
연속적으로 입력되는 입력값의 끝을 판단하려고 하였다.
예를들어 1 + 3+ 5 + 2 라는 값이 입력됐을 경우
while문을 통해 반복해서 값을 입력 받게하고
마지막 "2"가 들어오면 입력의 끝을 판단하고자 Scanner의 hasNext() 메서드를 사용했다.
[hasNext 사용 예]
Scanner input = new Scanner(System.in);
.
.
.
while (input.hasNext()) {
String operator = input.next();
double num2 = input.nextDouble();
.
.
.
}
그러나 while문에서 마지막 연산자와 숫자를 입력받은 뒤 다시 while의 조건문으로 들어올때 위와 같이 hasNext()를 사용하면 입력 받은 인자가 있는지를 확인하기 전에 콘솔 창에서 입력이 요구되었다.
즉, 위의 while문은 다음과 같은 순서로 진행되었다.
while문 안에서 입력된 마지막 연산자와 숫자 할당 -> 콘솔창에서 입력 요구 -> 콘솔창에서 입력한 값을 가지고 hasNext()적용
때문에 마지막 입력이라고 생각한 부분에서 while문이 멈추는 게 아니라 계속해서 입력이 요구되고 반복문은 멈추지 않았다.
3. 파악
원래는 정해진 입력을 받고 입력이 더 들어오지 않는다면 프로그램을 종료하려고 했다.
그런데 Scanner.next() 나 Scanner.nextInt(), Double()과 같은 메서드는 입력값을 공백으로 구분해서 나눠 받는다.
따라서 위의 메서드를 사용해서 입력을 받게 되면 항상 입력 대기상태가 된다.
공백을 기준으로 입력을 받기 때문에 입력 뒤에 계속 추가적으로 입력이 들어올 수 있기 때문이다.
즉 위의 방식으로는 어디가 입력의 끝인지 판단할 수 없다.
입력의 끝을 정하지도 않았고 알 수 없는데 입력의 끝을 찾아서 프로그램을 종료시키려고 한 게 문제였다.
끝을 알 수 없기에 콘솔 창에서는 계속 입력 대기 상태로 있었을 뿐이었고 값을 입력하면 hasNext()가 적용되었던 것이었다.
이 때문에 계속해서 while문이 반복될 수밖에 없었다.
4. 해결
생각해보면 우리가 일반적으로 사용하는 계산기도 연산을 입력한 뒤 "=" 과 같은 끝을 알리고 계산 값을 반환해달라는 입력을 명시해 주었다.
때문에 나도 "="을 입력받으면 while문을 벗어나고 계산값을 반환하도록 코드를 수정하였다.
[= 연산자 추가]
while (true) {
String operator = input.next();
if (operator.equals("=")) { //[1]
break;
}
double num2 = input.nextDouble();
.
.
.
}
● [1] : 연산자에 "=" 이 입력되면 while문을 벗어나도록 설정
'Error' 카테고리의 다른 글
Spring 3.0이후 변경해야하는 의존성_P6spy, QueryDsl, MySql (0) | 2023.06.04 |
---|---|
Spring Security DB 조회, 비밀번호 암호화 (0) | 2023.06.04 |
댓글