[JAVA] 키보드로 사용자 입력받는 2가지 방법 (BufferdReader, Scanner)
in JAVA
Elice Algorithm Code Challenge - Day 8
목차
1. BufferdReader, InputStreamReader, System.in
System.in
- 일반적으로 keyboard 입력을 지칭하는 Standard Input Stream
InputStreamReader
- byte stream을 character stream으로 변경해주는 역할 수행
- InputStreamReader 클래스는 생성자의 파라미터로 InputStream 객체를 전달받음
- 이 InputStream 객체의 종류에 따라 키보드 사용자 입력을 읽어들일수도 있고, 파일 내용을 읽어들일 수도 있음
- 사용법
- InputstreamReader (InputStream in)
- InputstreamReader (InputStream in, String charsetName)
- InputstreamReader (InputStream in, Charset cs)
- InputstreamReader (InputStream in, CharsetDecoder dec)
- 생성자의 파라미터로 charset 정보를 전달받아 읽어들이는 stream의 charset을 지정할 수도 있음
BufferedReader
- 효율적으로 문자를 읽어들이기 위해 버퍼링을 해줌
- 버퍼링 (Buffering)
- 효율적인 데이터 처리를 위해 중간 저장공간(Buffer)을 사용하는 것 (주로 입출력에서 사용)
- 디스크 접근은 시간이 오래걸리기 때문에 한번에 데이터를 저장하여 시간을 줄이고, 필요할 때마다 데이터를 읽음
- I/O작업은 시간이 많이 걸리기 때문에 버퍼링으로 접근횟수를 줄여 효율적으로 데이터 사용이 가능
- 버퍼링 (Buffering)
- 기본 버퍼 사이즈를 그대로 이용할 수도, 생성자를 이용해 버퍼 사이즈를 지정할 수도 있음
- 보통 FileReader, InputStreamReader의 read()와 같이 비용이 많이 드는 Reader를 파라미터로 전달받아 사용함
- 만약 BufferedReader없이 FileReader나 InputStreamReader를 사용하면 시스템은 바이트별로 사용자의 입력을 받아서 처리하는 동작을 반복함
- 시스템에서 IO는 자원소모가 많음
- 하지만 BufferReader를 사용하면, 시스템은 버퍼가 비어있을 때만, 실제 IO를 일으켜서 데이터를 읽어오고, 나머지 경우에는 메모리에 있는 버퍼의 데이터를 읽어서 처리함
- 데이터를 문자열로 받아오기 때문에, 적절히 데이터를 처리 후 사용해야 한다.
BufferdReader, InputStreamReader, System.in를 이용한 예제
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class UserInput { public static void main(String[] args) throws IOExceptio{ //키보드 사용자 입력을 받을 수 있는 객체 생성 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); // 입력 데이터 읽기 (한 줄) String str = reader.readLine(); // 입력 데이터 출력 System.out.println(str); } }
2. Scanner
- Scanner 클래스를 이용하면 1번 방법보다 더 쉽게 사용자 키보드 입력을 받을 수 있음
- 입력받은 데이터를 Scanner클래스 메소드를 사용해 더 쉽게 가공 가능
- 예제
import java.util.Scanner; public class ScannerLoop { public static void main(String[] args) { // Scanner 선언 Scanner scanner = new Scanner(System.in); //다음으로 읽어들일 token이 있는지 체크 while (scanner.hasNext()) { //token별로 입력값을 읽어 String을 리턴 String str = scanner.next(); System.out.println(str); } scanner.close(); } }
- token(공백)별로 사용자 입력값을 읽어들이는 예제