[Java] nextInt() 사용시 주의점 : nextLine() 스킵현상

Benjamin·2022년 11월 6일
0

JAVA

목록 보기
5/28
public class ScannerTest {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        System.out.println("숫자를 입력하세요");
        int option = input.nextInt();

        System.out.println("첫번째 문자열을 입력하세요.");
        String str1 = input.nextLine();

        System.out.println("두번째 문자열을 입력하세요.");
        String str2 = input.nextLine();

        System.out.printf("숫자 : %d, 문자열1 : %s, 문자열2 : %s", option, str1, str2);
    }
}	

위 코드는 option을 입력받고, 다음줄에 str1, 그다음줄에 str2를 입력받는것을 의도한 코드이다.
하지만 실제로 동작해보면 총 2개의 입력만받고 종료된다.
option, str2만 입력받고, str1은 스킵된것이다.

실제로 출력 결과도 아래와 같이 문자열1은 비어있다.

// 콘솔 결과

숫자를 입력하세요 
1
첫번째 문자열을 입력하세요. 
두번째 문자열을 입력하세요. 
나야나
숫자 : 1, 문자열1 : , 문자열2 : 나야나

이러한 문제는 왜 발생할까?

  • nextInt(), next(), nextFloat(), nextLong(), nextBoolean() 등은 "Enter"를 쳤을 때 입력되는 줄바꿈 문자를 읽지 못한다.
  • nextLine()은 줄바꿈 문자 전까지 파싱하여 값을 가져간다.(줄바꿈 문자 읽음)

즉 콘솔에서 1을 입력하고 엔터를 치는 순간, nextInt()에 의해 1이 입력되고, 엔터는 다음 nextLine()의 입력값으로 전달된다.
nextLine()은 줄바꿈 문자 전까지 파싱하여 값을 가져가는데, 줄바꿈 문자전의 값들은 nextInt()가 가져가고, 남은 입력값이 없으니 빈 문자열('')이 str1에 입력되는것이다.

전체 과정을 정리하면 다음과 같다.
1. '숫자를 입력하세요' 가 콘솔에 표시됨
2. '1엔터' 입력 ('엔터'는 실제 키보드 엔터를 쳤을 때 입력되는 값을 임의로 표현한 것)
3. '1엔터' 에서 '1'이 nextInt()에 의해 추출되고 '엔터'만 남음
4. '첫번째 문자열을 입력하세요.'가 콘솔에 표시되고 '엔터'가 nextLine()에게 전달됨
4. '엔터' 에서 '엔터'를 제외한 ''(빈 문자열)만 nextLine()에 의해 추출됨
5. '두번째 문자열을 입력하세요.' 가 콘솔에 표시됨
6. '나야나엔터' 에서 '엔터'를 제외한 '하이'만 nextLine()에 의해 추출됨

해결방법 (2가지)

  1. nextInt()를 썼다면 후에 실행될 입력메소드에 엔터도 값으로 식별되기 때문에, nextLine()을 써주며 엔터값을 받아줘야 오류를 방지할 수 있다.
  2. nextInt()를 사용한 후 next()를 사용해도 둘 다 엔터값을 인식하지않기때문에 입력이 가능하다.

next() : 사용자가 입력한값을 문자열로 (엔터치기 전까지 && 공백은 포함되지 않는다.)
nextInt() : 사용자가 입력한값을 정수로
nextLine() : 사용자가 입력한값을 문자열로 (엔터치기 전까지 && 공백 포함)


공백으로 숫자 구분 : nextInt()

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int N = sc.nextInt();
		int M = sc.nextInt();
		String L = sc.nextLine();
		String D = sc.nextLine();
        
		System.out.println(N);
		System.out.println(M);
		System.out.println(L);
		System.out.println(D);
	}
}

문득, nextInt()가 인식하지않고있는 개행문자가 언제까지 남아있을지 궁금해서 테스트해봤다.
위의 코드를 돌려본 결과, nextInt()를 두번 써도 nextLine()이 입력받아지지않는것은 L하나였다. (즉 이렇게 했을때, 3줄이 입력받아졌다)

1
2
3
이라고 차례로 입력했을 때, 1의 개행문자는 남아있지않고, 2의 개행문자가 L로 넘어가서 L에는 빈값이 들어가고, D로는 그 다음 입력값이 들어가며 프로그램이 종료된다.


두번째로 위와같이 입력했을 때, nextInt는 공백으로 값을 구분할 수 있으므로 1이 N으로, 2가 M으로 들어가고, ' 3 4'는 L로 들어가는것을 알 수 있다.
여기서 특이한점은 nextInt()가 값을 공백으로 구분해서 가져가지만, 공백까지는 가져가지않는것으로 보인다.
즉 공백직전까지 값을 가져간다. 그래서 L로 들어간 ' 3 4'에서 3앞에 공백이 한 칸 들어가있다.

0개의 댓글