nextInt() 이후에 nextLine()이 바로 왔을 때 공백이 입력되는 문제가 발생하였다.
그 이유에 대해 명확하게 파악하고 해결 방법을 기록한다.
개행 문자란 \n(줄바꿈)을 의미한다.
Scanner는 공백 문자를 기준으로 토큰을 읽어온다.
next, nextInt(), nextFloat() 등을 사용할 때 입력 버퍼에 공백이나 개행 문자가 남아있다면 해당 문자들은 토큰을 분리하는 역할을 하기 때문에 다음 next 메서드 호출 시 영향을 미칠 수 있다.
예를 들어 아래와 같은 코드일 때 문제가 발생한다.
Scanner in = new Scanner(System.in);
int num = in.nextInt();
String str1 = in.nextLine();
String str2 = in.nextLine();
String str3 = in.nextLine();
System.out.println(num);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
// 입력
// 123
// 홍길동
// 홍길동
// 출력
// 123
//
// 홍길동
// 홍길동
나는 분명 세개의 문자열을 입력받으려고 했는데
세개 중 맨 첫번째 라인은 공백이 입력되어 버렸다.
그 이유는 nextInt()는 숫자 이후의 개행 문자를 버리고
nextLine()은 개행 문자를 만나면 그 즉시 문자열을 반환하기 때문이다.
따라서, 이 문제를 해결하기 위해선 개행문자를 소비시켜줘야 한다.
아래는 개행 문자를 소비시켜주는 예시 코드이다
Scanner in = new Scanner(System.in);
int num = in.nextInt();
in.nextLine(); // 개행 문자 소비
String str1 = in.nextLine();
String str2 = in.nextLine();
String str3 = in.nextLine();
System.out.println(num);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
// 입력
// 123
// 홍길동
// 홍길동
// 홍길동
// 출력
// 123
// 홍길동
// 홍길동
// 홍길동
위와 같이 in.nextLine()을 사용하여 개행 문자를 소비시켜주면 해결된다!
개행 문자를 소비 시켜준다라는 말이 쉽지 않다..
쉽게 쉽게 생각해보자
nextLine()는 enter를 통해 입력이 된다.
반면에, nextInt()나, nextFloat(), nextDouble() ..등
nextLine()이 아닌 메서드들은 enter로 입력되지 않는다.
여기서 발생할 수 있는 예상치 못한 결과는
nextInt()와 nextLine()이 함께 사용될 때이다.
그에 대한 예시는 위에 코드로 나와 있으니 참고바랍니다.