자바에서 입력 데이터를 받는 방법에는 Scanner 클래스와 BufferedReader 클래스가 있다.
입력 데이터가 간단한 경우 Scanner를 사용하여도 무관하다.
그러나 입력 데이터가 많은 경우 Scanner는 시간 초과가 발생할 수 있다.
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int i = sc.nextInt();
double d = sc.nextDouble();
String str = sc.nextLine(); //문자열 입력
String[] result = str.split(" ");
💬 Scanner 클래스는 "토큰 단위"로 읽는다.
토큰(Token) : 공백문자(Spacebar, Tab, Enter 등)로 구분되는 요소
어떤 값을 입력받을 때, 컴퓨터는 공백문자까지도 버퍼에 저장한다.
즉, 내가 입력한 Spacebar나 Enter, Tab도 입력값과 함께 버퍼에 저장이 되고,
해당 공백문자를 다른 곳에서 읽어들이기 전까지는 버퍼에 남아있는 것이다.
따라서 nextLine() 메소드를 사용할 때 이전에 공백문자가 버퍼에 남아있다면,
nextLine()을 한번 더 써주어서 공백문자를 없애주자.
BuferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
String str = br.readLine();
int num = Integer.parseInt(str);
} catch (IOException e) {
e.printStackTrace();
}
`버퍼(buffer)란? 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 해당 데이터를
보관하는 임시 메모리 영역이다. 주로 입출력 속도 향상을 위해 버퍼를 사용한다.`
InputStreamReader 란? 문자 기반의 보조 스트림으로써 바이트 기반 스트림을 문자 기반 스트림으로 연결시켜 주는 역할을 한다.
```java
BufferReader br = new BufferReader(new InputStream(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// AB CD EFF GH 입력
st.nextToken() // AB
st.nextToken() // CD
st.nextToken() // EFF
st.nextToken() // GH
```
특정 문자 Token 지정하기
```java
String str = "this%is!my%string";
StringTokenizer st = new StringTokenizer(str, "%!");
st.nextToken() // this
st.nextToken() // is
st.nextToken() // my
st.nextToken() // string
```