Skip to content

Scanner 사용방법

참고자료

오라클 Scanner Document - Oracle java Scanner

사용자의 입력 값을 받고 싶을 때

Scannerjava.util에 존재하며, 사용자의 입력값을 받을 때 사용할 수 있다. 키보드(stdin), 파일, String 변수에서 입력 값을 받을 수 있다.

Scanner.java
1
2
3
4
5
6
7
8
// 키보드 입력(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
1
2
3
4
5
6
7
8
9
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
1
2
3
4
5
6
7
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();
}
output
1 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
1
2
3
4
5
6
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
1
2
3
4
5
6
7
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();


Comments