nextInt() 이후 nextLine()이 실행되지 않는 이유

Hanjmo·2023년 1월 15일

입력을 받는 코드를 작성하는 중에 nextInt()에서 입력을 받은 다음에 nextLine()에서는 입력을 받지 않고 넘어가는 일이 발생했다.
nextInt() -> nextInt() 이건 문제가 없었고, nextLine() -> nextLine() 또한 문제 없었는데 nextInt() -> nextLine()는 왜 문제가 생기는걸까?

nextInt(), next(), 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()에서도 입력 없이 넘어가버리는 상황이 발생한다.

해결 방법

1. nextInt(), next() 다음에는 nextLine()을 통해 남아 있는 값을 소거한다.

Scanner sc = new Scanner(System.in);

System.out.print("정수 입력: ");
int n = sc.nextInt();
sc.nextLine();

System.out.print("문자열 입력: ");
String s = sc.nextLine();

2. nextInt()와 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();

3. nextLine()으로만 입력 받고 문자열 형태의 숫자만 Integer.parseInt()로 형변환한다.

Scanner sc = new Scanner(System.in);

System.out.print("숫자 입력: ");
String numString = sc.nextLine();
int numInt = Integer.parseInt(numString);

next()의 남아 있는 값은 방법 1로만 해결이 가능하다. nextInt()의 남아 있는 값은 입력이 적을 때는 방법 1, 입력이 많을 때는 방법 2로 해결하는 것이 좋다.
숫자가 문자열로 들어올 상황이 발생할 수 있다면 방법 3으로 해결하는 것이 좋다.

0개의 댓글