[Java 공부 기록] scanner.nextLine(); 을 왜 넣으란거지?

자바 문법을 공부하며 Scanner에 대해서도 배웠고, 드디어 문제 풀이 시간이었다.

 

내가 봐도 깔끔하니 잘 풀었다 싶었는데 결과가,,,

 

왜 두번째 반복부터는 나한테 이름을 입력할 기회도 안주는거지..? 뭘 잘못 쓴건가? 했지만 아이러니하게도 굴러가기는 잘 굴러갔다.

그런데 왜 이상하지?

 

알고보니 내가 컴퓨터에 값을 입력하면 (예를 들어 : 30이라고 치고 Enter) 30이라는 값만 들어갔구나~하는데

사실은 '줄 바꿈' 문자 \n 라는 것도 함께 전송된다고 한다.

 

즉, scanner.nextint()는 숫자만 읽도록 설계되어 30을 입력한 후 Enter를 누르면 30만 가져가고 '줄 바꿈' 문자는 입력 버퍼(임시 저장 공간)에 그대로 남겨둔다. 마치 과자 봉지에서 과자만 쏙 빼 먹고 빈봉지는 냅두는것과 같다.

 

그렇다면 scanner.nextLine()은 어떨까? 이 메서드는 '줄 바꿈' 문자를 만날 때까지의 모든 값을 읽고 '줄 바꿈' 문자까지도 함께 소비해버린다.

 

여기서 문제가 발생하는것이다. while문을 다시 실행하고 이름을 물어볼때 아까 버퍼에 남아있던 '줄 바꿈'문자가 사용자가 Enter를 눌러 이름을 입력했다고 착각해 name 변수에 넣어버려, 이름을 입력할 기회조차 얻지못하게 되는것이다.

 

쉽게 말해 scanner.nextint()가 남기고 간 '줄 바꿈' 찌꺼기를 scanner.nextLine()이 청소기 역할을 하며 치워주게 된다.

 

scanner.nextLine(); 을 추가해 정상적으로 실행되는 코드