Language/Java

[Java] next()와 nextLine()의 차이

pongic 2022. 9. 25. 12:48
반응형

Scanner클래스에는 String을 입력받는 메서드 next()와 nextLine()이 있다.

공통점은 둘 다 문자열로 반환시켜준다는 것이다.

next() 메서드는 공백(space)전까지 입력받은 문자열을 반환한다는 것이다.

nextLine() 메서드는 Enter를 치기 전까지 쓴 문자열 모두를 반환한다는 것이다.

 

 

Scanner.next()

Scanner in = new Scanner(System.in);

String str = in.next();
// next()는 공백 문자를 받아들이지 않는다.
// "a a"를 입력해봤을때를 가정해보자
System.out.println(str);

// 입력 
a a

/* 출력
a
*/

출력결과를 보면 a a 를 입력을 받았지만 처음에 a만 저장되어 출력되는 것을 확인할 수 있다. 다시 말해 next는 토큰의 개념으로 문자열을 입력받는데 해당 토큰에서 공백 문자는 구분자로 인식해 앞에 있는 a만 저장되는 것이다.

즉, 쉽게 말하면 Enter키는 물론 Space키도 구분자로 인식하여 저장되지 않는다.

 

 

Scanner.nextLine()

Scanner in = new Scanner(System.in);

String str = in.nextLine();
// nextLine()은 공백문자도 모두 저장하여 출력한다.
// "a a"를 입력해봤을때를 가정해보자.
System.out.println(str);

// 입력 
a a

/* 출력
a a
*/

공백 문자와 상관없이 콘솔 창 한 줄(Line)에 있으면 모두 문자열로 인식해 String변수로 리턴한다. a a 를 입력값으로 넣어주면 공백 문자와 상관없이 모두 저장된 것을 확인할 수 있다.

 

 

 

next()와 nextLine() 동시에 사용하면?

Scanner in = new Scanner(System.in);
String str1 = in.next();
System.out.println("str1 : " + str1);
String str2 = in.nextLine();
System.out.println("str2 : " + str2);

// 입력
a a

/* 출력 결과
str1 : a
str2 :  a
*/

위와 같이 나오는 이유는 next()로 받고 남은 " a"가 In.nextLine()으로 넘어가기 때문이다. " a" 라는 버려진 문자열은 지금 버퍼에 남겨져 있는 상태인데 버퍼를 처리하지 않고 다시 str2를 입력받으려고 하면 버퍼 측에서는 이미 저장되어 있는   " a"를 출력하는 것이다.

 

 

 

해결방법 : 버퍼 처리방법

Scanner in = new Scanner(System.in);
String str1 = in.next();
System.out.println("str1 : " + str1);
in.nextLine(); 		 //  nextLine() 메서드 호출
String str2 = in.nextLine();
System.out.println("str2 : " + str2);

// 입력
a a
b b

/* 출력 결과
str1 : a
str2 : b b
*/

위와 같이 nextLine()으로 변수에 담기 전에 메서드만 호출해 버퍼를 지워주면 문제가 해결된다.

반응형