입력을 받는 코드를 작성하는 중에 nextInt()에서 입력을 받은 다음에 nextLine()에서는 입력을 받지 않고 넘어가는 일이 발생했다.
nextInt() -> nextInt() 이건 문제가 없었고, nextLine() -> nextLine() 또한 문제 없었는데 nextInt() -> nextLine()는 왜 문제가 생기는걸까?
nextInt(): System.in으로 입력 받은 int형 값을 뽑아내서 return 전까지 반환한다.
next(): System.in으로 입력 받은 연속된 문자열을 뽑아내서 공백 전까지 반환한다.
nextLine(): System.in으로 입력 받은 문자열을 뽑아내서 return을 포함해 반환한다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("정수 입력: ");
int n = sc.nextInt();
System.out.print("문자열 입력: ");
String s = sc.nextLine();
System.out.println("\n\n입력 받은 정수와 문자열은 다음과 같다.");
System.out.println("정수: " + n);
System.out.println("문자열: " + s);
}
}
예를 들어 30을 입력했을 때, Scanner(System.in)은 '3'+'0'+'return'이라는 입력을 받는다.
nextInt()는 int형 값을 return 전까지만 반환하므로 '3'+'0'만 반환하고, 'return'은 Scanner(System.in)에 남게 된다.
그 다음에 "next"를 입력하면, Scanner(System.in)은 앞에서 남겨진 'return'을 포함해 'return'+'n'+'e'+'x'+'t'+'return'이라는 입력을 받게 된다.
nextLine()은 문자열을 return을 포함해 반환하므로 'return'만 반환하고, 'n'+'e'+'x'+'t'+'return'은 Scanner(System.in)에 남게 된다.
즉, nextInt()에서 입력을 반환한 다음, nextLine()에서 Scanner(System.in)에 남아 있는 'return'만 반환하기 때문에 입력을 받지 않고 넘어가는 것처럼 보이는 것이다.
이 외에 next() -> next()와 next() -> nextLine()에서도 입력 없이 넘어가버리는 상황이 발생한다.
Scanner sc = new Scanner(System.in);
System.out.print("정수 입력: ");
int n = sc.nextInt();
sc.nextLine();
System.out.print("문자열 입력: ");
String s = sc.nextLine();
Scanner scInt = new Scanner(System.in);
Scanner scLine = new Scanner(System.in);
System.out.print("정수 입력: ");
int n = scInt.nextInt();
System.out.println("문자열 입력: ");
String s = scLine.nextLine();
Scanner sc = new Scanner(System.in);
System.out.print("숫자 입력: ");
String numString = sc.nextLine();
int numInt = Integer.parseInt(numString);