[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를 사용하는 것이 효과적이다.
'JAVA' 카테고리의 다른 글
Java 기본 자료형(Primitive Type)과 참조 자료형(Reference Type)의 차이 (0) | 2024.11.16 |
---|---|
Java 기본 자료형(Primitive Type)과 참조 자료형(Reference Type)의 차이 - 메모리 (1) | 2024.11.15 |
Java 에서 큰따옴표(" ")와 작은따옴표(' ') 의 차이 (1) | 2024.11.10 |
자바 표준 입력 Scanner 클래스를 알아보자 (4) | 2024.11.09 |
[Java] nextLine() 오류 (0) | 2024.10.31 |