부트캠프/문제해결

[문제해결] Java 개인 과제 - Level 2 - 8

purple95 2024. 7. 29. 20:11

입출력을 받기위해 Scanner 객체를 생성하며 입력을 받는 도중

 

프로그램 흐름이 의도치 않게 넘어가거나 실행되는 경우가 종종 있을 것이다.

 

바로 입출력 버퍼에 문제가 생긴 경우이며 오늘 그 경우가 개인 과제 수행 도중 발생하였다.

 

우선 문제상황을 유발하게 된 코드와 실행 화면

원인은 sc.nextDouble()에 있다.

의도는 이러하다, 두 번째 숫자인 secondNumber 변수에 nextDouble()로 입력값을 받되.

다른 타입의 입력을 받게되면 당연히 오류가 발생할 것이므로, try catch문으로 오류를 캐치한 뒤

오류 상황에 대한 메시지를 출력하고, continue를 실행시켜 아예 초기 흐름으로 건너 뛰어버리자.

 

하지만 실행 결과는 아래와 같다, 숫자가 아닌 타입 "ㅁ"을 입력했고. 

오류 캐치도 잘 실행되고 continue로 실행 초기로 잘 넘어갔다, 다만.

 

"올바르지 않은 계산방식 입력입니다."  

 

입력을 하지 않았음에도 스스로 입력을 받았다고 하며 넘어가버리는 문제가 있었다.

실행 흐름을 보자

....

....

 

원인은 continue로 실행 흐름 초기로 넘어간 상황에서 무엇인가의 이유로 calcCase에 입력값이 들어갔고.

if, else if문을 지나 else 문으로 스스로 넘어가버린것.

 

calcCase가 스스로 무엇인가 값을 넘겨받은것이 이유기 때문에, 바로 그 전 단계의 입력과정에 

원인이 있다는 것은 당연하다.

 

우선, nextDouble()이 어떻게 동작하는가?

nextDouble()은 입력장치를 통해 입출력 queue에 들어온 값 중에서 Enter와 space 를 기준으로, 그 앞의

Double타입 값을 가져오게됩니다.

그리고 저는 입력을 한 뒤, Enter 키를 눌러 입력을 종료했습니다,

이렇게되면 입출력 queue에는 Enter 즉, '\n' 개행문자가 남아있는 상태가 유지됩니다.

secondNumber에는 올바른 값이 전달되었지만, 큐에 남아있는 개행문자는.

그 다음루프에서 문제를 일으키게됩니다.

 

그 원인이 되는 nextLine()의 동작 방식입니다.

nextLine()은 큐에 남아있는 것을 문자열 타입으로 가져옵니다, 따라서.

calcCase = sc.nextLine()이 실행되는데 

자동으로 큐에 남아있던 개행문자 '\n'을 calcCase가 넘겨받게 되고, if, else if를 지나 else문까지 

도달하게 된것입니다.

 

해결

주석처리를 해둔 코드가 해결방안인데, continue로 다음 루프로 넘어가기 전에 sc.nextLine()을 실행시켜서

입출력 큐를 비워주는 작업을 해주었더니, 해결이 되었습니다.

 

현재는 Level 2- 10까지 진행하며 코드 구조를 뜯어고치느라 다른 방식으로 해결했는데

다른 방식에서는 secondNumber를 String타입 입력으로 받게 고치느라

nextDouble()이 아닌 nextLine()으로 입력받고 입출력 큐를 비워주는 작업을 해주던

sc.nextLine()은 삭제하는것으로 진행했습니다.

 

따라서 sc.next(), nextInt(), nextDouble()이런 것들을 사용하여 입력을 받을 때에 한번쯤 주의해 볼 만 한 사항인것같습니다.