가장 기본적인 입력 클래스이다.
import java.util.Scanner
// 사용하기 위해 Scanner 클래스가 존재하는 java.util 패키지를 추가한다.
Scanner in = new Scanner(System.in);
// 객체를 생성해서 사용
Scanner의 입력 메서드는 다음과 같은 종류가 있다.
in.nextByte(); //byte형 입력 및 린턴
in.nextShort(); //short형 입력 및 리턴
in.nextInt(); //int형 입력 및 리턴
in.nextLong();
in.nextFloat();
in.nextDouble();
in.nextBoolean();
in.next(); // String 형, 공백 기준으로 한 단어를 읽는다.
in.nextLine() // String형, 개행을 기준으로 한 줄을 읽는다.
위에서 알아본 Scanner과 출력 시 일반적으로 사용되는 System.out.println(””)은 시간 소모가 심하다는 단점이 존재한다.
따라서, BufferReader를 사용하는 것이 Scanner를 사용하는 것보다 빠른 성능을 보여준다.
BufferedReader br = new BufferedReader(new InputStream(System.in));
String input = br.readLine();
//하지만 BufferReader는 정수를 입력 받는 메서드를 제공하지 않기 때문에 직접 변환이 필요하다.
int a = Integer.parseInt(br.readLine());
문제를 풀다보면 입력이 아래처럼 주어지는 경우가 많다.

이런 경우에 StringTokenizer를 사용하면 빠르게 처리할 수 있다.
BufferedReader br = new BufferReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken);
int b = Integer.parseInt(st.nextToken);
import java.io.BufferedWriter;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write("hello bw"); // 괄호 안의 값을 출력한다.
bw.newLine(); // 줄바꿈
bw.flush(); // 버퍼에 남아있는 데이터를 비운 후, 해당 데이터를 출력한다.
bw.close(); // 버퍼에 남아있는 데이터를 비운 후, 해당 데이터를 출력한 뒤 스트림이 닫힌다.
💡 BufferedWriter를 사용한 후에는 반드시 flush() 혹은 close()를 작성해줘야한다. (버퍼에 남아있는 데이터를 비우기 위해)
⚠️ BufferedWirter는 문자열을 기반으로 데이터를 쓰기 때문에 정수는 바로 쓰면 이를 문자열로 변환하려고 하면서 이상한 데이터가 들어가게 된다.