본문으로 바로가기

next() vs nextLine()

category Java언어 2018. 7. 6. 15:14

next()

공백을 기준으로 문자열을 구분하여 입력받음.

' '(공백)을 만나기 전까지를 입력받음.

ex)

입력 : 강아지는 귀엽다.

출력결과 : 강아지는

 

nextLine()

개행문자(\n)를 기준으로 문자열을 구분하여 입력받음.

\n(개행문자)를 만나기 전까지를 입력받음.

ex)

입력 : 강아지는 귀엽다.

출력결과 : 강아지는 귀엽다.



연속해서 문자열을 입력 받을 경우 발생하는 문제

문자열을 입력 받을 때 항상 고려해야 하는 부분은 버퍼이다.

 

C언어에서와 마찬가지로 java에서도 버퍼에 데이터를 저장한 후 변수에 저장을 하게된다.

개행 문자를 기준으로 입력을 구분하는 nextLine()를 이용해 입력을 받는다면

입력받은후 남은 개행문자가 다음 문자 입력에 영향을 주지않게 하기 위해선 반드시 버퍼를 clear 해야한다.

그런데 버퍼를 clear하지 않고 다음 문자 입력에서 next()를 사용하면 정상적으로 입력받아진다.

반면 버퍼를 clear하지 않고 다음 문자 입력에서 nextLine()을 사용하면 버퍼안의 찌거기 데이터로 인해 정상적인 동작이 이루어지지 않는다.

 

이러한 현상이 발생하는 이유는 공백과 개행문자의 차이 때문이다.

공백 문자 =  ' '

개행 문자 = '\n'

공백 문자와 개행 문자를 입력할 때 우리는 spacebar와 enter키를 이용해 입력하다보니 문자와 문자 사이에 빈 공간이 있다면 그것이 공백이 라고

생각할 수 있지만 둘은 엄연히 다른 문자이다.


next()는 개행 문자를 토큰 구분자로서 인식하지않기 때문에 버퍼 clear을 하지 않아도 문제가 발생하지 않은 것이다. 반면

개행 문자를 토큰 구분자로 인식하는 nextLine()는 버퍼에 남은 개행 문자의 영향으로 문제가 발생하는 것이다.



버퍼에 남은 개행 문자를 clear하는 방법

문자를 입력받는 두 로직 사이에 nextLine()을 추가하여 버퍼에 남은 개행 문자를 해결할 수 있다.

 

 

토큰

토큰이란 문자들을 구분하는 한 덩어리라고 볼 수 있다. 예를들어 "강아지는 너무 귀엽다."에서

"강아지는" "너무" "귀엽다." 이렇게 각각이 하나의 토큰이된다.

 

개행문자

개행문자란 쉽게말해 엔터(enter), \n, 줄바꿈과 모두 같은말이다.

 

 

 

'Java언어' 카테고리의 다른 글

Thread란?  (1) 2018.08.16
OOP 란?  (0) 2018.08.16
Wrapper클래스 활용  (0) 2018.07.10
class의 구성  (0) 2018.07.10
Java에서 단일 문자열 입력  (0) 2018.07.10