안녕하세요. 이번 시간에는 java scanner next 메서드와 nextline 메서드의 차이점을 알아보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ne_li4.png)
먼저 next 메서드 입니다. complete token을 찾는다고 되어 있습니다. Scanner의 경우, 입력을 받을 소스만 넘겨주는 경우 delimeter가 white space입니다. 개행, 공백, 탭 문자와 같은 것들입니다. 이들을 포함하지 않는 완전한 토큰을 찾고, 이를 리턴합니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ne_li5.png)
nextLine은 현재 line의 남은 부분들을 돌려줍니다. 단, line seperator를 제외합니다. 해당 문자는 소모하긴 하는데, 결과에서 제외합니다. 입력을 보면서, 두 함수가 어떤 차이가 있는지 자세하게 보겠습니다.
먼저 입력으로 쓸 파일은 아래와 같습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ne_li1.png)
1번째 줄이 4, 2번째 줄이 1입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ne_li2.png)
예제 1번 프로그램은 next() 함수로 입력을 받은 다음에, nextLine() 함수로 입력을 받습니다. 실행 결과가 어떻게 나올까요? 결과 먼저 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ne_li3.png)
s1 : 4가 나오고, s2 : 가 나옵니다. s2에 빈 문자열이 들어갔다는 의미입니다. 왜 그런지 도식화한 상황 그림으로 이해해 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ne_li6.png)
입력 버퍼에는 위와 같이 있습니다. 먼저, next 메서드로 입력을 받았습니다. 이것은 완전한 token을 돌려줍니다. scanner 생성자에 System.in밖에 넘겨주지 않았으므로, whitespace가 포함되지 않은 완전한 토큰인 4를 돌려줍니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ne_li7.png)
즉, next 메서드는 4를 소모합니다. \n은 소모하지 않습니다. 이제, nextLine을 불렀습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/ne_li8.png)
중요한 것은, 현재 line은 1이므로, 1번째 line의 나머지 부분을 읽게 됩니다. \n이 남아있었기 때문에, nextLine은 \n을 소모하게 됩니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/re_li9.png)
입력이 위와 같았다면 어떻게 될까요? next는 완전한 토큰인 4를 만날 때 까지 계속 문자를 소모합니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/re_li10.png)
next가 4까지 소모했습니다. 이 시점에서 3번째 line은 남아 있습니다. nextLine()은 현재 line을 모두 읽기 때문에, 3번째 줄의 \n이 nextLine 메서드로 소모되게 됩니다.
이제 아래 프로그램을 보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/re_li11.png)
예제 2번 프로그램은 Scanner의 nextLine 메서드로 먼저 입력을 받은 다음에, next 메서드로 입력을 받습니다. 아까와 같이 1번째 줄에 4, 2번째 줄에 1만 있는 입력을 받아보겠습니다. 어떻게 될까요?
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/re_li12.png)
s1 : 4, s2 : 1이 나옵니다. 왜 이렇게 나왔는지 상황을 도식화 시켜 봅시다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/re_li13.png)
먼저 nextLine으로 1번째 줄이 소모가 됩니다. 그리고 4가 출력이 됩니다. 개행은 제외되기 때문입니다.
![](https://codingdog.pe.kr/wp-content/uploads/2023/07/re_li14.png)
이제 버퍼에는 1만 남았습니다. next 메서드는 1을 소모할 수 있습니다. 따라서, next는 1을 읽게 됩니다. 하나 팁을 드리면, 보통 저는 문자열을 입력 받을 때, nextLine으로 입력받고, parsing을 하는 방식을 많이 사용합니다. 변수가 적기 때문입니다.