[JAVA] 키보드로 사용자 입력받는 2가지 방법 (BufferdReader, Scanner)

Elice Algorithm Code Challenge - Day 8

목차

  1. BufferReader, InputStreamReader, System.in
  2. Scanner

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작업은 시간이 많이 걸리기 때문에 버퍼링으로 접근횟수를 줄여 효율적으로 데이터 사용이 가능
  • 기본 버퍼 사이즈를 그대로 이용할 수도, 생성자를 이용해 버퍼 사이즈를 지정할 수도 있음
  • 보통 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(공백)별로 사용자 입력값을 읽어들이는 예제