스캐너 (Scanner)

스캐너는 여러분들이 키보드로 입력받거나, 파일로 입력받거나 문자열로 입력을 받는데 도움을 주는 아주 유용한 클래스로 JDK1.5 버전부터 추가된 클래스입니다. 입력에 아주 유용한 클래스이기 때문에 반드시 알아야할 필요가 있습니다. 

Scanner클래스는 키보드, 파일, 문자열 등으로 입력받기 위해 다양한 생성자를 제공하며 다양한 자료형을 입력받을 수 있지요. Scanner에서 입력을 받으려면 next[자료형]() 메소드를 이용하면 되는데, 여기서 next~() 메소드를 표로 정리하였습니다. 이 메소드들과 나머지 유용한 Scanner 메소드의 사용법은 아래의 예를 통해서 사용하며 익히게 될 겁니다. Scanner의 생성자는 다양한데 항상 두번째 argument는 인코딩 방식의 Charset의 이름입니다. 예를 들어 UTF-8인지 ANSI인지 지정할 수 있죠. 지정하지 않는다면 OS에서 지정된 default charset으로 지정됩니다. 보통 쓸일은 없습니다.

 

Scanner의 next~() 메소드


입력받는 자료형과 다른 자료형의 데이터가 읽혀지면 InputMismatchException이 발생하니 상황에 맞춰 예외처리를 하시기 바랍니다. 모든 nextLine()을 제외한 next~() 메소드는 구분자가 공백입니다.

메소드명 설명
nextBoolean() boolean의 자료형을 입력받습니다. 자료형은 두개인 true,false로 대소문자를 구분하지 않습니다.  
nextByte() byte의 자료형을 입력으로 받습니다. 입력 범위(127~ -128) 밖이면 InputMismatchException이 발생합니다.
nextShort() short의 자료형을 입력받습니다.
nextInt() int형의 자료형을 입력받습니다. 
nextLong() long형의 자료형을 입력받습니다.
nextDouble() double형의 자료형을 입력받습니다.
nextFloat() float형의 자료형을 입력받습니다.
next() String형의 문자열을 입력받습니다. 이때 공백 문자까지 입력받습니다.  
nextLine() 문자열을 입력받는데 다른 next~() 메소드와 다른 점은 줄단위로 입력받는다는 점입니다. 

 

 

지금 보여드리는 사용법은 Scanner의 아주 기초적인 키보드에서 입력을 받는 예입니다.

키보드 입력

Scanner는 InputStream을 생성자로 받을 수 있는데, 여기서 키보드 입력을 받으려면 System.in의 InputStream을 넘겨주면 됩니다. 

Scanner in=new Scanner(System.in);

 

아래의 예제는 nextInt()로 문자열의 입력받을 갯수를 입력받아 for 루프로 단어를 입력받는 예제입니다.

public static void main(String[] ar) {
	Scanner in=new Scanner(System.in);
	int N=in.nextInt();
	String []strs=new String[N];
	for(int i=0;i<N;i++) 
		strs[i]=in.next();
		
	for(int i=0;i<N;i++)
		System.out.println("String["+i+"] : "+strs[i]);
		
}

 

정수 입력을 3, 그리고 문자열을 공백으로 주어 입력받은 결과입니다.

3
My Name reakwon
String[0] : My
String[1] : Name
String[2] : reakwon

 

문자열에서 입력

Scanner는 문자열로도 입력을 받을 수 있습니다. 

	String str="2 boys and 2 girls";
	Scanner in=new Scanner(str);
		
	int num1 = in.nextInt();
	String word1 = in.next();
	String word2 = in.next();
	int num2 = in.nextInt();
	String word3 = in.next();
	System.out.println(num1+" "+word1+" "+word2+" "+num2+" "+word3);

 

위의 str의 문자열은 입력된 형식을 정확히 안다는 가정하에 코딩한 것입니다. 2는 int형, 그리고 boys는 문자열 이렇게 Scanner의 메소드로 입력을 받는 예제입니다. 여기서 모든 입력은 공백으로 구분되어 집니다. 아래는 그 결과입니다.

2 boys and 2 girls

 

파일에서의 입력

이번에는 파일을 입력 삼아서 읽어볼까요? 아래의 파일이 프로젝트와 같은 디렉토리에 존재한다고 해봅시다. 아래에 input.txt를 만들어주세요.

위 파일은 모두 실수이죠?  그래서 nextDouble()메소드를 사용할 것인데 이때 double의 자료형이 있는지 검사하며 자료형이 존재하면 내용을 읽어서 출력하고 싶습니다. 이때 사용할 수 있는 메소드가 hasNext[자료형] 입니다.

public static void main(String[] ar) throws IOException {
		
	Scanner in=new Scanner(new File("input.txt"));
	System.out.println("파일로부터 실수 입력");
	while(in.hasNextDouble()) {
		System.out.println(in.nextDouble());
	}
}

 

파일에서 입력을 받을때는 IOException이 발생할 수 있으므로 throws 키워드를 사용해서 IOException을 처리해줍니다. while문에 보이는 hasNextDouble()이 보이시나요? 이 메소드가 다음에 double의 자료형을 갖는 데이터가 있냐고 물어보는 메소드로 있다면 true, 아니면 false를 반환합니다. 나머지의 int, float, boolean 역시 저 메소드 명의 형식을 따라가니까 사용해보시면 됩니다. 여기서는 굳이 정리하지 않겠습니다.

구분자 정하기(Delemiter)

구분자는 기본적으로 공백인데 필요에 따라서는 우리가 정해야될 필요가 있습니다. 그럴때 사용할 수 있는 메소드가 useDelimiter() 메소드입니다. useDelimiter()는 두가지로 오버로딩이 되어있는 메소드인데, 단순 문자열로만 구분할 수 있는 메소드와 정규표현식을 사용하여 쓸 수 있는 구분자가 사용됩니다. 여기서 한번 구분자를 우리가 정해보도록 합시다. 아까 사용했던 input.txt파일을 이렇게 바꿔봅시다.

 

라인 단위로 -로 실수가 구분되어있습니다. 이것을 방금 전에 결과와 같게 만든다면 어떻게 구현하면 좋을까요? 우선 line단위로 입력을 받는다면 그 line은 "실수1-실수2-실수3..." 으로 구분되어있겠죠. 그리고 "-"를 구분자로 삼아서 nextDouble() 메소드로 읽어주면 됩니다. 그래서 Scanner가 2개가 필요합니다. 아래의 코드가 그 구현을 보여줍니다.

public static void main(String[] ar) throws IOException {
		
	Scanner in=new Scanner(new File("input.txt"));
	System.out.println("파일로부터 실수 입력");
		
	while(in.hasNextLine()) {
		Scanner line=new Scanner(in.nextLine());	//Line단위의 입력을 Scanner의 전달
		line.useDelimiter("-");						//"-"을 구분자로 사용
			
		while(line.hasNextDouble()) {				//다음 Double 자료형이 있는가?
			System.out.println(line.nextDouble());	//있다면 Double 출력
		}
	}
}

 

코드의 결과는 동일합니다.

파일로부터 실수 입력
1.1
2.2
3.3
4.4
5.5
11.1
12.2
13.3
14.4
15.5

 

이렇게 Scanner에 대한 사용법에 대해서 알아보았습니다. Scanner는 Stream과 정규 표현식을 자세히 알면 유용한 클래스입니다. 이상으로 Scanner에 대한 코드와 설명이었습니다.

반응형
블로그 이미지

REAKWON

와나진짜

,