ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] Scanner 와 BufferedReader
    프로그래밍 언어/JAVA 2023. 1. 26. 11:07

     

    사용자(키보드)에 입력을 받기 위해 Scanner 클래스를 사용한다. 하지만 알고리즘을 풀다보면 시간 초과가 발생하는 경험을 하게 된다. 나는 아직 해보기 전인데, 간단한 문제 풀고 다른 사람의 답변을 보니 Scanner 보다 BufferedReader를 더 많이 사용하더라. 그래서 정리해볼까 한다. 

     

    일단) Scanner와 BufferedReader 클래스는 둘 다 사용자 입력을 받을 수 있는 기능을 제공한다. 두 클래스가 가지고 있는 가장 큰 차이점은 속도이다. 

     

     

    <Scanner 사용>

    import java.util.Scanner;
    
    public class Input {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            String input = sc.nextLine();
        }
    }

     

     

    <BufferedReader 사용>

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Input {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
            String input = br.readLine();
        }
    }

     

     

    평균적으로 BufferedReader 사용시에 0.6585, Scanner 사용시에 4.8448초가 걸리는 차이가 있다. 

     

     

     

    📑 속도 차이가 나는 이유는?

     

    BufferedReader 사용할때와 Scanner를 사용할때 속도 차이가 나는 이유는 buffer 사용 여부의 차이이다. Scanner는 1KB 크기의 버퍼를 갖기 때문에 입력이 바로 전달되는 반면 BufferedReader는 8KB 버퍼를 가져  buffer에 입력들을 저장하였다 한 번에 전송하기 때문에 속도가 더 빠르다. 

     

     

     

     

    📑 예외 처리

     

    System.in 과 BufferedReader 클래스를 사용할 때는 main 옆에 throws IOException이 붙는다. 사용자의 입력은 여러 다양한 타입으로 들어올 수 있는데, 잘못된 값이 들어올 경우 에러가 나지 않도록 예외처리를 해줘야한다. 

     

    Scanner는 System.in을 생성시에 내부에서 try-catch를 사용하여 예외처리를 하기 때문에 예외 처리를 하지 않아도 된다. 

     

     

     

    📑 그럼 Scanner 대신 항상 BufferedReader 사용해야되나?

     

    그건 아니다. Scanner는 BufferedReader보다 훨씬 활용적이다. 스캐너의 경우 int, short, long, float, double을 구분지어 읽어들일 수 있고 String 또한 읽을 수 있다. 반면 BufferedReader는 문자열 String 값 밖에 읽지 못한다. 

     

    또한, BufferedReader은 Scanner에 비해 큰 버퍼를 차지하기에 긴 문자를 읽을 땐 BufferedReader, 짧은 문자를 읽을 땐 Scanner를 사용하는 걸 추천한다. 

     

     

     

     

     

    출처 : https://dlee0129.tistory.com/238

    반응형

    댓글

Designed by Tistory.