입력방식에 대한 이야기를 할 뿐, 속도에 대한 이야기는 하지 않는다.
Scanner nextInt(), next()
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a + b);
Scanner sc = new Scanner(System.in);
String a = sc.next();
String b = sc.next();
System.out.println(a + " " + b);
공백 or 개행문자로 끊어서 받는다.
두 입력형식 모두 가능
(1) ( nextInt() 사용했다고 가정 )
1 2'\n'
-> 3
(2) ( nextInt() 사용했다고 가정 )
1'\n'
2'\n'
-> 3
이 경우는?
(3) ( nextInt() 사용했다고 가정 )
1 2 3'\n'
-> 3
입력의 마무리는 개행문자 입력을 통해 이뤄지기 때문에 두번째 공백 이후에도 계속 입력할 수는 있지만 들어가지는 않는다. (1, 2 까지만 정상적으로 들어감)
Scanner nextLine()
Scanner sc = new Scanner(System.in);
String a = sc.nextLine();
String b = sc.nextLine();
System.out.println(a + " " + b);
개행문자로만 끊어서 입력을 받는다.
String을 입력받는 함수이기 때문에 공백문자는 String의 일부로서 입력된다.
(1)
1234 1234 1234'\n'
asdf asdf asdf'\n'
-> 1234 1234 1234 asdf asdf asdf
공백문자는 입력을 종료시키지 못한다.
BufferedReader read()
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = br.read();
int b = br.read();
System.out.println(a + " " +b);
Single character 를 입력받아 그에 해당하는 아스키 코드를 int로 반환한다.
공백문자 입력은 입력을 종료하는 시그널로 사용되는 것이 아니라 하나의 단일문자로서 받아들여진다.
개행문자 입력은 입력을 종료하는 시그널로 사용되는 동시에 하나의 단일문자로서 받아들여진다.
(1)
1 2'\n'
-> 49 32
'1'에 대한 아스키 49
' '에 대한 아스키 32까지만 입력이 들어가고 2는 무시되었다.
(2)
(공백만 5개 입력)
-> 32 32'\n'
' ' 에 대한 아스키 32가 두 번 들어오고 뒤에 입력한 3개의 공백문자는 무시되었다.
다만 개행문자가 입력되기 전까지 입력을 계속 받을 뿐이다.
즉, 공백문자를 두개만 입력받으면 이미 a, b에 32가 할당되긴 했으나 개행문자 입력 전까지는 입력이 종료되지는 않은 상태를 유지하게 된다.
(3)
'\n''\n'
-> 10 10
개행문자에 대한 아스키 10이 두 번 들어오고 즉시 입력이 종료된다.
(4)
a, b에 1, 2를 할당할 생각으로
1'\n'
2'\n'
를 입력하려고 할 경우
1'\n' 단계에서 a = '1'의 아스키 49, b = '\n'의 아스키 10 이 입력되고 바로 종료되어버린다.
2'\n'를 입력받지 못하고 바로 종료된다.
(5)
12'\n'
-> 49 50
a = 49, b = 50 을 넣고 종료한다.
즉, BufferedReader의 next() 로는 두자리 숫자를 입력받지 못한다. (애초에 single character를 입력받는다고 했으니 당연)
단일문자로의 숫자를 숫자값 그대로 받고 싶다면
br.read() - '0' 으로 받으면 된다.
BufferedReader readLine()
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String a = br.readLine();
String b = br.readLine();
System.out.println(a + " " +b);
줄 단위로 입력받아 String 으로 반환한다. 즉, 개행문자로 끊어서 입력을 받는다.
공백문자를 아무리 입력해도 String의 일부로서 입력되어질 뿐 입력 종료에는 영향을 미치지 않는다.
(1)
(공백문자 * 5)'\n'
(공백문자 * 5)'\n'
-> (공백문자 * 11) (sout에 있는 것까지 총 11개)
(2)
asdf asdf'\n'
1234 1234'\n'
-> asdf asdf 1234 1234