본문 바로가기
study/JAVA

nextInt 다음에 nextLine 쓰면 문제가 되는 이유. (feat. buffer)

by stilinski 2022. 4. 9.
728x90

nextInt에 int가 아닌 다른 값을 넣었더니 그 값이 다음에 수행할 nextLine()에 들어가서 nextLine을 자동 종료시켜버린 모습.

 

nextInt에 int가 아닌 값을 입력하면 값이 버퍼에 남아있음.

사용자가 값을 입력하면 cpu는 값이 다 입력될때까지 버퍼에 값을 담아놓음.

그러다가 다 입력되면 nextInt의 경우 cpu는 버퍼에 담긴 enter전까지의 숫자로 전환 가능한 입력값을 int로 내보내게 됨.

그러나 숫자가 아닌 문자를 입력해버리면 해당되는 데이터가 없어서 내보낼 수가 없음.

만약 a를 입력하면 a + enter가 버퍼에 남아있게 됨.

 

버퍼에 그 값이 남아있는 상태에서 nextLine을 호출하게 되면 문제가 됨.

nextLine은 입력값 + \n까지 버퍼에 저장했다가 가져옴. 즉 nextInt는 \n를 버퍼에 남겨두는 반면에 nextLine은 \n까지 버퍼에서 가져오게 된다. 그러니 nextInt를 사용하고 나서 버퍼에 \n를 포함한 값이 남아있는 상태에서 nextLine을 쓰게 되면 nextLine은 \n까지를 문자열로 인식해서 받아오기 때문에 버퍼에 남은 \n를 끝으로 한 값을 가져오고 종료가 되는 것이다.

 

 

사실 nextInt에 잘못된 값이 입력되면 그다음에 nextLine 말고 nextInt를 써도 문제가 될 수 있다.

nextInt에 값을 입력하면 일단 버퍼로 들어감. d를 입력할 시 버퍼에 d+enter가 저장되고 원래는 숫자를 입력했다면 enter앞부분만 숫자로 전환해 가져오지만 ,,, 숫자가아니니 그대로 버퍼에 남게 됨.  그러면... 그다음에 실행할 nextInt는 버퍼에 있는 d+ enter을 마주하게 값을 입력받지도 않았는데 잘못된 값을 넣었다는 에러가 나오게 됨.

 

 

 

mextInt가 반복문에 있는데 잘못된 값을 입력하면 버퍼에 그 값이 남아있어서 nextInt는 계속 그 값을 읽어오기 때문에 무한반복됨...ㅋㅋㅋ

혹사당하는 메모리 ㅇㅅㅇ 

 

 

728x90

댓글