인프런 커뮤니티 질문&답변

스프링님의 프로필 이미지

작성한 질문수

나도코딩의 자바 기본편 - 풀코스 (20시간)

입력

next(), nextLine() 질문있습니다~

23.12.15 10:50 작성

·

250

0

System.out.println("무슨 프로그래밍 언어를 배웠나요?");         
String lang = sc.next();           
System.out.println("배우고 나니 기분이 어땠나요?");        
 String feeling = sc.next();         
 //nextLine();         
System.out.println("또 공부하고 싶은 언어가 있나요?");         
String want = sc.nextLine();  
         
System.out.println("언어 : " + lang);         System.out.println("느낀점 : " + feeling);         System.out.println("공부하고싶은 언어 : " +want );

선생님! feeling을 입력한 뒤에 그냥 3줄 다 출력되고 스캐너가 종료되는데 이유를 잘 모르겠습니다!

답변 1

0

나도코딩님의 프로필 이미지
나도코딩
지식공유자

2023. 12. 16. 23:43

안녕하세요?

질문주신 현상이 생기는 원인은 next()와 nextLine()을 함께 사용할 때 발생하는 스캐너 입력 버퍼의 문제입니다. 입력 버퍼는 사용자가 키보드로 입력한 내용을 일시적으로 저장해두는 공간이라고 보시면 되는데요. 프로그램이 사용자로부터 입력을 받을 때, 입력 버퍼에 그 내용이 저장되고 프로그램은 내용을 읽어와 처리합니다.

이때 next() 메소드를 사용하게 되면 토큰 단위(단어 단위 정도로 생각하시면 좋습니다. 기본값으로는 공백이 구분자가 됩니다.)로 문자열을 읽어오게 됩니다.

가령 다음 코드와 같이 세 번의 next()를 사용하고 입력값을 "사과 딸기 바나나" 라고 한다면 각각 "사과", "딸기", "바나나" 로 구분지어서 입력을 받게 되지요.

// "사과 딸기 바나나" 라고 입력 시 공백으로 구분
System.out.println(sc.next()); // 사과
System.out.println(sc.next()); // 딸기
System.out.println(sc.next()); // 바나나
(실행 결과)
사과
딸기
바나나

그런데 사실은 이렇게 입력을 할 때 "사과 딸기 바나나" 뿐만 아니라 사용자가 치는 엔터 키(개행) 또한 입력에 포함됩니다. 그래서 입력 버퍼에는 "사과 딸기 바나나\n" 이렇게 들어가게 되는데요. 3번의 sc.next() 는 개행을 제외한 "사과", "딸기", "바나나" 까지만 입력을 받아오므로 엔터 키는 아직 버퍼에 남아 있게 됩니다.

그리고 바로 이어서 nextLine()을 사용하게 되면 버퍼에 남아 있던 엔터 키를 읽어들여서 빈 문자열로 저장을 하게 되는 것이죠. 즉 사용자는 "다음 과일" 을 입력하지도 않았는데 프로그램이 종료가 되어버립니다.

// "사과 딸기 바나나" 라고 입력 시
System.out.println(sc.next());
System.out.println(sc.next());
System.out.println(sc.next());

String nextFruit = sc.nextLine(); // 버퍼에 남아 있던 엔터 키를 읽음
System.out.println("다음은 무슨 과일? " + nextFruit);
(실행 결과)
사과
딸기
바나나
다음은 무슨 과일? // 바로 프로그램 종료

이를 해결하기 위해서는 버퍼에 남아 있던 엔터 키를 소비해주는 방법이 있습니다.

강의에서 설명한 '불필요한 문장을 삭제' 부분이 이에 해당하지요.

sc.nextLine(); // 불필요한 문장을 삭제

따라서 다음과 같이 sc.nextLine()을 추가하여 입력 버퍼를 비워주면 됩니다.

// "사과 딸기 바나나" 라고 입력 시
System.out.println(sc.next());
System.out.println(sc.next());
System.out.println(sc.next());

sc.nextLine(); // 불필요한 문장을 삭제

String nextFruit = sc.nextLine(); // 새로운 입력 받기
System.out.println("다음은 무슨 과일? " + nextFruit);
(실행 결과)
사과
딸기
바나나
// 사용자 입력 대기. "포도" 입력
다음은 무슨 과일? 포도

그러면 위와 같이 모든 입력을 올바로 받을 수 있게 됩니다.



질문주신 코드에 대입해보면 주석으로 처리 되어 있던 부분을 이렇게 살리면 되겠네요 😊

System.out.println("무슨 프로그래밍 언어를 배웠나요?");         
String lang = sc.next();           
System.out.println("배우고 나니 기분이 어땠나요?");        
String feeling = sc.next();

sc.nextLine(); // 불필요한 문장을 삭제 <= 이 부분

System.out.println("또 공부하고 싶은 언어가 있나요?");         
String want = sc.nextLine();         
System.out.println("언어 : " + lang);         
System.out.println("느낀점 : " + feeling);         
System.out.println("공부하고싶은 언어 : " + want);
(실행 결과)
무슨 프로그래밍 언어를 배웠나요?
// "자바" 입력
배우고 나니 기분이 어땠나요?
// "좋았어요" 입력
또 공부하고 싶은 언어가 있나요?
// "파이썬" 입력
언어 : 자바
느낀점 : 좋았어요
공부하고싶은 언어 : 파이썬

궁금증 해결에 도움되길 바라겠습니다.

감사합니다.

스프링님의 프로필 이미지
스프링
질문자

2023. 12. 18. 09:48

선생님 자세한 설명 감사합니다 ㅠㅠ 이해했습니다!