사용자의 입력값을 받기 위해
Scanner 클래스를 주로 사용한다.
외워서 사용했던 Scanner 클래스를
자세히 들여다 보기로 하자.
Scanner 클래스란?
JDK 1.5 버전부터 추가된 Scanner은 java.util 패키지에 존재한다.
화면으로 입력을 받거나, 파일, 문자열로 입력받는 등 데이터를 읽어 오는데 유용한 클래스이다.
Scanner 클래스는 다음과 같은 생성자를 지원한다.
Scanner(String source)
|
지정된 String 형태의 입력소스를 읽어 오는 생성자이다.
|
Scanner(File source)
|
지정된 파일 형태의 입력소스를 읽어 오는 생성자이다.
|
Scannser(InputStream source)
|
키보드, 파일 등 지정된 입력스트림을 읽어 오는 생성자이다.
|
Scanner(Path source)
|
파일의 경로로 입력소스를 읽어 오는 생성자이다.
|
이 외에도 다양한 생성자를 지원하므로 공식문서를 참고하자.
Scanner method
입력받은 데이터의 형식과 다른 형식의 데이터가 읽혀지면 InputMismatchException 오류가 발생한다.
Scanner은 다음과 같은 데이터 형식의 메서드를 제공함으로 입력된 데이터 형식과 맞는 메서드를 사용해야 한다.
nextBoolean()
|
boolean의 자료형, true,false로 대소문자를 구분하지 않는다.
|
nextByte()
|
byte의 자료형
|
nextShort()
|
short의 자료형
|
nextInt()
|
int형의 자료형
|
nextLong()
|
long형의 자료형
|
nextDouble()
|
double형의 자료형
|
nextFloat()
|
float형의 자료형
|
next()
|
String형의 문자열, 공백 문자를 기준으로 한 단어
|
nextLine()
|
String형의 문자열, 개행을 기준으로 한 줄
|
close()
|
Scanner 종료
|
hasNext()
|
boolean의 타입으로 반환되며
이동할 항목이 있다면 true을 리턴하고 그렇지 않으면 false을 리턴 |
Scanner 사용하기
Step 1. import
import java.util.Scanner;
Step 2. Scanner 인스턴스 생성
Scanner 클래스 타입의 scanner 변수에 Scanner 인스턴스를 생성하고 입력받는 클래스인 System.in를 넘겨준다.
Scanner scanner = new Scanner(System.in);
Step 3. 사용자의 입력값 받기
정수형의 자료형을 입력받아 정수형 변수에 담는다.
System.out.print("숫자를 입력하세요. >");
int number = scanner.nextInt();
Scanner 예제
키보드 입력
키보드와 연결된 자바의 표준 입력 스트림 System.in을 넘겨준다.
다음 예제는 nextLine()으로 문자열을 입력받아 ","를 구분자로 자른 뒤 for문으로 출력한다.
import java.util.Scanner;
public class test {
public static void main(String[] args) {
// Scanner 인스턴스 생성
Scanner scanner = new Scanner(System.in);
// 문자열을 담는 빈 배열을 초기화한다.
String[] argArr = null;
String prompt = ">";
System.out.print(prompt);
// 키보드로부터 문자열을 한 줄 기준으로 입력받는다.
String inputValue = scanner.nextLine();
// 입력받은 문자열을 ,를 구분자로 자른다.
argArr = inputValue.split(",");
for (int i = 0; i < argArr.length; i++) {
System.out.println(argArr[i]);
}
scanner.close();
}
}
파일 입력
파일을 받을 수 있는 객체를 생성하여 text.txt 파일로부터 데이터를 읽어온다.
다음 예제는 text.txt파일에 정수형의 데이터를 받아와 합을 구하는 예제이다.
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class test {
public static void main(String[] args) throws IOException {
// Scanner 인스턴스 생성
Scanner scanner = new Scanner(new File("/Users/seominah/Desktop/test.txt"));
int sum = 0;
int cnt = 0;
// 정수형의 입력값이 있을 경우 true, 없을경우 false를 반환하여 종료된다.
while (scanner.hasNextInt()) {
sum += scanner.nextInt();
cnt++;
}
System.out.println(sum);
scanner.close();
}
}
nextInt() 사용 후 nextLine() 사용 시 유의점
예제를 풀던 중
nextInt()로 정수형 데이터를 입력받은 후
문자열 데이터를 입력받기 위해 nextLine()을 사용하니
공백으로 넘겨지며 종료가 되었다.
Scanner scanner = new Scanner(System.in);
System.out.print("숫자 입력 >");
int number = scanner.nextInt();
System.out.print("문자 입력 >");
String arg = scanner.nextLine();
System.out.println(number);
System.out.println(arg);
nextInt() 메서드는 사용자의 입력값의 마지막 개행문자를 제거하지 않는다.
개행문자 전까지의 정수형 데이터를 입력받고
개행문자는 다음nextLine()메소드의 입력값으로 처리가 된다.
해결책 1. nextLine(); 추가
개행 문자를 처리할 nextLine()을 추가한다.
Scanner scanner = new Scanner(System.in);
System.out.print("숫자 입력 >");
int number = scanner.nextInt();
scanner.nextLine();
System.out.print("문자 입력 >");
String arg = scanner.nextLine();
System.out.println(number);
System.out.println(arg);
해결책 2. 문자열로 입력받아 정수형으로 변환하기
입력값을 문자열로 받은 후 구분자를 통해 자른 뒤 문자열을 정수형으로 변환한다.
Java에서는 문자열을 정수형으로 변환하기 위해 Integet 클래스를 사용한다.
Scanner scanner = new Scanner(System.in);
System.out.print("숫자 입력 >");
String input = scanner.nextInt();
int number = Integer.parseInt(input);
scanner.nextLine();
System.out.print("입력 >");
String arg = scanner.nextLine();
System.out.println(number);
System.out.println(arg);
Scanner 클래스는 그냥 외워서 사용하다가
이번에 문제를 풀면서 nextInt()메서드 사용 후 nextLine()메서드를 사용할 때
종료되는 문재점을 만나면서 자세히 알아봐야겠다는 계기가 되었다.
자바가 기본으로 제공하는 클래스의 양도 방대해서 외우기만 했었는데
기본적인 거라도 클래스 내부를 찾아보는 시간을 가지는 것이 많은 도움이 되었다.
Scanner 클래스를 공부하면서
Stream에 대한 이해가 부족하다는 것을 느겼다.
다음에는 Stream에 대해 알아보자.
'Language > JAVA' 카테고리의 다른 글
LocalDateTime 에서 String, String에서 LocalDateTime 변환 (0) | 2022.05.29 |
---|