자바를 공부하다가 의문이 생긴 점이 있다.
import java.util.*;
public class Next {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("숫자를 입력하세요: ");
int num = scanner.nextInt();
System.out.print("문자를 입력하세요: ");
String name = scanner.nextLine();
System.out.println("입력한 숫자는: " + num);
System.out.println("입력한 문자는: " + name);
scanner.close();
}
}
숫자 하나와 문자 하나를 입력받아 출력하는 간단한 코드를 짰다.
그리고 이 코드를 돌려보면,
당연히 이런 식으로 실행이 될 것 같지만, 실제 결과는 아래와 같다.
숫자를 입력 받는 순간, 문자를 입력받는 문장이 씹히고 출력 문장이 바로 출력된다.
왜 이런 결과가 나온 것일까?
이리저리 구글링을 한 결과,
String name = scanner.nextLine();
위 문장에서 사용된 nextLine()의 특성을 내가 정확하게 몰랐기 때문이다.
(nextLine()을 단순히 문자열을 전부 입력받을 때 사용하는 것인줄 알았다.)
Scanner 클래스의 메소드
문자열을 입력받는 대표적인 메소드에는 next()와 nextLine()이 있다.
String next() -> 다음 토큰을 문자열로 리턴 (개행문자를 무시)
String nextLint() -> '\n'을 포함하는 한 라인을 읽고 '\n'을 버린 나머지만 리턴 (개행문자를 포함한 한 줄 단위로 입력)
nextLine()은 개행문자를 포함한 한 줄 단위로 입력내용을 받는데,
이는 즉, 문장의 처음부터 개행문자(\n)까지만 읽는다는 것이다.
System.out.print("숫자를 입력하세요: ");
int num = scanner.nextInt();
System.out.print("문자를 입력하세요: ");
String name = scanner.nextLine();
숫자를 입력받는 문장에서 사용한 nextInt()는 개행문자(및 분리자)를 제외하고 읽어오기 때문에
예를 들어, 숫자를 1을 입력했을 경우,
버퍼에는 1과 '\r\n'(엔터)가 함께 들어가고 nextInt()는 숫자만 입력받는다.
그래서 여전히 버퍼에는 \r\n만 남아있게 된다.
결국, 이후 문장에서 nextLine()메소드가 실행되면 버퍼에 남아 있는 \r\n만 읽어오게 된다.
(개행문자가 있으면 문장의 끝이므로)
해결 방법
1. 버퍼에 있는 \r\n을 없애주기
아래와 같이 버퍼에 남아 있는 것을 제거하기 위해 nextLine() 메소드 문장을 추가한다.
System.out.print("숫자를 입력하세요: ");
int num = scanner.nextInt();
scanner.nextLine();
System.out.print("문자를 입력하세요: ");
String name = scanner.nextLine();
2. 이후 메소드를 개행문자(및 분리자)를 무시하는 next()를 사용하기
System.out.print("숫자를 입력하세요: ");
int num = scanner.nextInt();
System.out.print("문자를 입력하세요: ");
String name = scanner.next();
요약
* 버퍼관리를 잘하자