Scanner nextInt()와 nextLine() 개행문자 문제

김성수·2023년 5월 22일
0

Java

목록 보기
4/18

들어가면서..

nextInt() 이후에 nextLine()이 바로 왔을 때 공백이 입력되는 문제가 발생하였다.
그 이유에 대해 명확하게 파악하고 해결 방법을 기록한다.



Scanner와 개행 문자

개행 문자란 \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()이 함께 사용될 때이다.

그에 대한 예시는 위에 코드로 나와 있으니 참고바랍니다.


profile
깊이 있는 소프트웨어 개발자가 되고 싶습니다.

0개의 댓글