Scanner와 BufferedReader의 차이 및 성능 비교
자바(Java)에서 입력을 처리할 때 자주 사용하는 두 가지 클래스인 Scanner와 BufferedReader는 각기 다른 방식으로 데이터를 읽고 처리합니다. 이 글에서는 두 클래스의 동작 방식, 성능 차이의 원인, 그리고 사용 사례를 비교하여 정리했습니다.
1. Scanner와 BufferedReader란?
Scanner
- Scanner는 간단한 입력 처리를 위해 설계된 클래스입니다.
- 데이터를 읽으면서 즉시 **파싱(Parsing)**하여 정수, 실수, 문자열 등의 형태로 변환할 수 있습니다.
- 한 번에 한 글자 또는 한 단어씩 데이터를 처리하며, 주로 소규모 입력에 적합합니다.
BufferedReader
- BufferedReader는 대량 데이터를 효율적으로 처리하기 위해 설계된 클래스입니다.
- 데이터를 한꺼번에 읽어 **버퍼(buffer)**라는 메모리 공간에 저장한 뒤 처리합니다.
- 주로 파일 입력이나 대량 데이터 처리에 적합합니다.
2. Scanner와 BufferedReader의 데이터 처리 방식
Scanner의 동작 방식
- 데이터를 처리할 때마다 운영체제에 I/O(Input/Output) 요청을 보냅니다.
- 운영체제는 입력 장치(키보드, 파일 등)로부터 데이터를 한 글자씩 읽어와 CPU가 즉시 처리합니다.
- 이러한 방식은 매번 운영체제와의 상호작용(I/O 작업)이 발생하므로 속도가 느릴 수 있습니다.
BufferedReader의 동작 방식
- 데이터를 처리할 때, 운영체제에 한꺼번에 대량 데이터를 요청합니다.
- 운영체제는 데이터를 한 번에 읽어와 **RAM(버퍼)**에 저장합니다.
- 이후, CPU는 버퍼에 저장된 데이터를 RAM에서 가져와 처리합니다.
- I/O 작업은 최소화되고, 대부분의 처리가 RAM에서 이루어지므로 더 빠릅니다.
데이터를 처리할 때 실제 흐름
운영체제와 Scanner
- I/O 작업:
키보드/파일 → 운영체제 스트림 → 프로세스(Scanner).- 예: 1234라는 데이터를 처리할 때, 운영체제는 1 → 2 → 3 → 4를 각각 요청받아 처리.
- I/O 작업이 4번 발생.
BufferedReader
- 버퍼링 작업:
키보드/파일 → 운영체제 스트림 → 버퍼 → 프로세스(BufferedReader).- 예: 1234라는 데이터를 처리할 때, 운영체제는 한 번에 1234를 버퍼로 읽어옴.
- I/O 작업이 1번 발생.
3. Scanner vs BufferedReader: 속도 비교
Scanner의 단점
- 데이터를 읽을 때마다 운영체제와 상호작용(I/O 작업)을 수행합니다.
- I/O 작업은 디스크, 네트워크, 키보드 등 하드웨어와 통신해야 하므로 시간이 오래 걸립니다.
BufferedReader의 장점
- 데이터를 한 번에 대량으로 읽어 RAM에 저장하고, 이후 데이터를 RAM에서 처리합니다.
- I/O 작업이 최소화되며, RAM에서의 데이터 처리 속도는 I/O 작업보다 훨씬 빠릅니다.
속도 비교 비유
- Scanner: 데이터를 한 글자씩 가져올 때마다 운영체제에 "한 글자 주세요!"라고 요청. (우체부가 한 번에 한 장씩 편지를 배달)
- BufferedReader: 데이터를 한꺼번에 가져와 RAM에 저장한 뒤, 저장된 데이터를 처리. (우체부가 가방 가득 편지를 한 번에 배달)
4. 사용 사례 비교
기준 Scanner BufferedReader
| 입력 처리 규모 | 소규모 입력 처리 (키보드 입력 등) | 대규모 데이터 처리 (파일, 네트워크 등) |
| 성능 | 느림 | 빠름 |
| 데이터 파싱 | 즉시 파싱 가능 | 별도로 파싱 필요 |
| 코드 간결성 | 간단함 | 약간 복잡함 |
5. 운영체제, CPU, RAM의 역할
운영체제 (OS)
- 운영체제는 입력 장치(키보드, 파일, 네트워크 등)와 프로그램(Scanner, BufferedReader) 간의 데이터를 중재합니다.
- Scanner는 데이터를 읽을 때마다 운영체제에 요청을 보내므로, 하드웨어와의 상호작용(I/O 작업)이 많아 느립니다.
- BufferedReader는 데이터를 한 번만 요청한 뒤, 이후 처리는 주로 RAM에서 이루어집니다.
CPU
- Scanner와 BufferedReader 모두 CPU가 최종적으로 데이터를 처리합니다.
- Scanner는 운영체제로부터 한 글자씩 데이터를 받아 처리하고,
- BufferedReader는 RAM에서 데이터를 가져와 처리합니다.
RAM
- RAM은 프로그램이 실행되는 동안 데이터를 저장하고 처리하는 고속 메모리입니다.
- BufferedReader는 데이터를 RAM에 저장한 뒤 처리하기 때문에 운영체제와의 상호작용 없이 빠르게 동작합니다.
- 운영체제의 I/O 작업보다 RAM 작업이 훨씬 빠르기 때문에 BufferedReader의 성능이 더 뛰어납니다.
6. RAM 작업이 빠른 이유
- RAM은 CPU와 가까운 위치에 있는 초고속 메모리입니다.
- RAM에서의 데이터 처리는 초당 수십 GB~TB 수준으로 가능하지만,
- 운영체제의 I/O 작업은 디스크, 네트워크, 키보드 등 하드웨어와의 통신이 필요하므로 속도가 느립니다.
7. 최종 정리
- Scanner는 운영체제 I/O 작업을 자주 수행하며, 한 글자씩 데이터를 처리하므로 속도가 느립니다.
- BufferedReader는 데이터를 한꺼번에 읽어 RAM에 저장한 뒤 처리하기 때문에 속도가 빠릅니다.
- BufferedReader는 운영체제와의 상호작용을 최소화하고 RAM에서 처리하므로 대규모 데이터 처리에 적합합니다.
따라서, 입력 데이터를 빠르게 처리해야 하는 코딩 테스트나 대규모 파일 작업에서는 BufferedReader를 사용하는 것이 유리합니다. 반면, 간단한 키보드 입력 처리와 같은 경우에는 Scanner가 더 간편합니다.
728x90
반응형
LIST