[Java] next(), nextLine() 차이점, nextLine() 실행 안될때!

서현서현·2022년 2월 18일
0

작은 실수들

목록 보기
2/19
post-thumbnail

간단한 입출력 예제를 실행하는데, nextLine()이 실행이 안되고 바로 개행이 되는 문제가 생겼다!

import java.util.Scanner;
public class TestChapter2 {
	public static void main(String[] args) {
	Scanner scanner = new Scanner(System.in);
	
	System.out.print("이름: ");
	String name = scanner.nextLine();
	
	System.out.print("주민번호 앞 6자리: ");
	int card = scanner.nextInt();
	
	System.out.print("전화번호: ");
	String tel = scanner.nextLine();
	
	System.out.printf("%s\n%d\n%s",name,card,tel);
	
	}}

위와같이 nextLine(), nextInt(), nextLine()이 번갈아가며 입력을 받게 할때, 이름과 주민번호 앞 6자리와 전화번호까지 입력을 해야하는데


이름과 주민번호까지만 입력이 가능하고 이후론 입력을 받지 않는것이다.

문법엔 문제가 없다고 생각했는데, 이유를 알아보니 버퍼와 관련된 문제였다

  1. scanner를 이용해 키보드로 입력을 받게 되면 그 데이터는 '버퍼'에 저장된다
  2. 이때 enter키를 통해 문장을 마치므로, 버퍼에는 '데이터+\n'이 같이 들어가게 된다
  3. nextInt()가 이 버퍼에서 데이터를 가져가는데, 공백을 허용하지 않으므로 '데이터'만 가져간다.
  4. 만약 nextInt가 또 데이터를 가져가려 한다면, 버퍼엔 인식할수 없는 공백만 남아있으므로 다시 키보드를 통한 입력을 받아간다.
  5. 그러나 위 코드에서는 공백을 허용하는 nextLine을 사용했으므로, 버퍼에 남아있던 '\n'을 인식하여 가져가고, 결국 입력을 받지 않은채로 개행하는 것이다.

모두 nextLine()으로 바꿔주면 해결


요약

덧붙여, 간단하게 요약하자면
nextLine() : 개행문자까지 읽음

따라서 위와같이 공백도 같이 읽는것이 nextLine인것

next() : 공백 전까지 읽음

위와같이 공백전까지 읽는것이 next인것!

next()와 nectLine()을 순서대로 반환하면

이렇게 된다. 설명하자면 공백 전까지인 "안녕하세요"를 next()가 출력시키고, 그 이후 공백+"같이 공부해여!!"를 nextLine()이 출력시킨다.


아까와 같이 next()를 반복하다가 nextLine()을 하면 nextLine()은 입력받지 않을것임. 왜냐하면 공백전까지만 읽으므로 \n이 세번 쌓여있으니까 \n직전의 아무것도 없는것을 읽음

0개의 댓글