[Scanner의 장단점]

그동안은 아주 간단하게 Scanner 클래스를 이용해서 입력을 받고 출력을 하는 형태를 자주 써 왔다. 

Scanner의 큰 장점은 지원하는 메서드가 많아서 String, int, double, float, boolean 등등 원하는 타입에 맞춰서 메서드를 바꿔 주기만 하면 사용이 가능했다. 

하지만 단점은 버퍼 사이즈가 1024char 이라 많은 입력을 필요로 할 경우에는 성능 상 좋은 결과를 얻을 수 없다. 알고리즘을 풀면서 시간초과 같은 문제를 직면하게 되는 이유이다. 

 

[Scanner 와 BufferReader 의 성능 차이]

BufferedReader가 Scanner보다 성능이 좋은 이유는 주로 두 가지 때문이다. 

 

1.버퍼 크기 차이
BufferedReader는 기본적으로 큰 버퍼(8192 바이트)를 사용하여 데이터를 읽는다. 큰 버퍼를 사용하면 데이터를 한꺼번에 많이 읽어 들이기 때문에 디스크 I/O 요청이 적어 성능이 향상된다. 반면, Scanner는 작은 버퍼(1024 바이트)를 사용하여 상대적으로 더 자주 I/O 요청을 발생시켜 성능이 떨어질 수 있다.

 

2. 추가 기능에 따른 오버헤드

Scanner는 입력된 데이터를 특정 형식으로 파싱(숫자나 단어 단위로 분할)하는 기능을 제공한다. 이러한 기능은 편리하지만 성능 오버헤드가 발생하게 된다. 반면, BufferedReader는 단순히 줄 단위로 문자열을 읽기 때문에 파싱 오버헤드가 거의 없다 한다. 

 

         디스크나 파일 
               |
               |
         [데이터 스트림]
               |
               |
        ┌─────────────┐               ┌──────────────┐
        │  Buffered   │               │   Scanner    │
        │   Reader    │               │              │
        └─────────────┘               └──────────────┘
               |                               |
               |                               |
         [Large Buffer]                  [Small Buffer]
         (8192 bytes)                    (1024 bytes)
               |                               |
               |                               |
     바로 데이터 라인을 읽음           토큰으로 파싱 한다
      (Low overhead)                   (Higher overhead)
               |
               |
           ┌────────┐
           │ 사용자 │
           │  코드  │
           └────────┘

 

이렇게 BufferedReader는 큰 버퍼를 사용해 데이터를 한 번에 많이 가져오고, 단순히 줄 단위로 데이터를 읽기 때문에 빠르게 처리할 수 있다. 반면, Scanner는 작은 버퍼를 사용하면서 데이터를 자주 요청하고, 파싱 작업을 추가로 수행하여 상대적으로 느리기 때문에 대량의 데이터를 읽어야 할 때에는 BufferReader를 사용하는 것이 효과적이다.

 

해니01_15