Scanner 사용방법
사용자의 입력 값을 받고 싶을 때
Scanner
는 java.util
에 존재하며, 사용자의 입력값을 받을 때 사용할 수 있다. 키보드(stdin)
, 파일
, String
변수에서 입력 값을 받을 수 있다.
Scanner.java |
---|
| // 키보드 입력(System.in)에서 가져오기
Scanner scan1 = new Scanner(System.in);
// 파일에서 가져오기
Scanner scan2 = new Scanner(new File("filename.txt"));
// string 값에서 가져오기
String read = "Hello World!";
Scanner scan3 = new Scanner(read);
|
delimiter
Scanner
는 delimiter(구분자)로 입력값을 구분한다. default delimiter는 공백(" ") 이다..
delemeter-example.java |
---|
| String read = "1 2 3 4 abcd";
Scanner scan1 = new Scanner(read);
int a = scan1.nextInt();
int b = scan1.nextInt();
int c = scan1.nextInt();
int d = scan1.nextInt();
String str = scan1.next();
System.out.printf("%d %d %d %d %s",a,b,c,d,str).println();
scan1.close(); // 더 이상 입력값을 받지 않음
|
delemeter 변경
추출하고 싶은 구분자를 다른 문자로 변경하고 싶으면 useDelimiter()
메소드를 이용해보자. 그렇게 된다면 csv 파일
같이 ,
로 구분하는 파일을 읽기가 수월할 것이다.
delemeter-example2.java |
---|
| String read = "1,2,3,4,abcd"
Scanner scan1 = new Scanner(read).useDelimiter(",");
int a = scan1.nextInt();
int b = scan1.nextInt();
int c = scan1.nextInt();
int d = scan1.nextInt();
String str = scan1.next();
System.out.printf("%d %d %d %d %s",a,b,c,d,str).println();
scan1.close(); // 더 이상 입력값을 받지 않음
|
hasNext
delimiter로 추출 가능한 입력값이 있는지 확인하려면 hasNext()
메소드를 이용하면 된다. 이는 파일이나, 문자열을 입력 받을 때, 문자열의 끝 파일의 끝까지 추출하고 싶을때 사용할 수 있다.
hasNext |
---|
| String read = "aaa\nbbb\nccc\nddd\n";
Scanner scan1 = new Scanner(read);
int lineNum = 1;
while(scan1.hasNext()){
System.out.printf("%d %s",lineNum++,scan1.nextLine()).println();
}
|
output1 aaa
2 bbb
3 ccc
4 ddd
next vs nextLine의 차이
nextOOO()
또는 next()
와 nextLine()
의 차이점은 개행(\n
)의 처리 여부의 차이이다.
next()
는 delimiter 대로 처리하지만, 입력의 끝인 \n
을 처리하지 않아 scan 객체에 남게 된다.
nextLine()
은 delimiter가 개행이므로 delimiter로 설정되어 있는 것들을 무시하고, 개행까지 처리하기 때문에 delimiter를 처리하고 남은 \n를 처리하기 때문에 아래와 같은 상황에서 nextLine() 입력값이 제대로 저장이 안되는 경우가 있다.
next_nextLine.java |
---|
| Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
String s = scan.nextLine(); // ""가 강제로 받게됨
System.out.printf("a : %d ,s : \"%s\"",a,s).println();
|
따라서 s가 nextInt()
위에서 받게하거나, 아래와 같이 dummy nextLine()
을 넣어 입력값을 새로 받게 하는 것이 정설이다.
next_nextLine.java |
---|
| Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
scan.nextLine(); // dummy scanNext();
String s = scan.nextLine(); // ""가 강제로 받게됨
System.out.printf("a : %d ,s : \"%s\"",a,s).println();
|