본문 바로가기
Java/java 기초

[Java] Scanner의 문제점

by usang0810 2019. 11. 26.
package com.test.run;

import java.util.Scanner;

public class Run {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("숫자 입력 : ");
		int iNum = scan.nextInt();
		
		System.out.print("문자열 입력 : ");
		String str = scan.nextLine();
		
		System.out.println(iNum + " " + str);
	}
}

위의 코드에서 원하는 답안은 숫자 하나를 입력받고 문자열을 입력받아 연결시켜 출력하는 구문입니다.

하지만 위의 코드를 실행하면 뜻밖의 에러가 발생합니다. 

숫자 입력 : 5
문자열 입력 : 5 

숫자만 입력했을 뿐인데 문자열은 입력도 못해보고 숫자가 출력되며 프로그램이 종료하게 됩니다.

 

이러한 문제점은 Scanner 클래스의 nextLine()메소드와 다른 메소드들이 읽어오는 범위가 다르기 때문입니다.

nextInt(), nextDouble() 등 과 같은 메소드는 \n문자(개행문자) 전까지를 읽어오고 \n문자 자체는 읽어오지 않으므로 버퍼의 출발점이 \n문자 전에 있습니다. nextLine() 메소드는 \n문자까지만 읽어오므로 nextInt(), nextDouble() 등 과 같은 메소드 이후에 사용하면 버퍼의 출발점이 바로 \n문자 전이기 때문에 에러가 발생하게 됩니다. 따라서 nextLine() 메소드를 사용하기 전에 nextInt()같은 메소드를 사용하였다면 nextLine() 메소드를 사용함으로써 버퍼의 출발점 위치를 변경해주어야 합니다.

 

package com.test.run;

import java.util.Scanner;

public class Run {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		System.out.print("숫자 입력 : ");
		int iNum = scan.nextInt();
		scan.nextLine();
		
		System.out.print("문자열 입력 : ");
		String str = scan.nextLine();
		
		
		System.out.println(iNum + " " + str);
	}
}
숫자 입력 : 5
문자열 입력 : five
5 five

위와 같이 코드를 수정하면 의도했던데로 출력이 나오게 됩니다.

next()메소드도 정수, 실수형 메소드들과 마찬가지로 개행문자 자체는 읽어오지 않습니다.