자바(Java)로 개발을 하다 보면 사용자 입력을 처리할 때 Scanner와 BufferedReader 고민하게 된다.
데이터를 읽어오는 것은 비슷해 보이지만, 내부 동작 방식과 성능, 안정성 면에서 큰 차이가 있다고 하는데
두 클래스의 핵심 차이점을 명확히 이해하고, 상황에 맞는 최적의 입력 방식을 선택해보면 좋을듯 하다.
핵심 역할 이해: Parse vs. Read
Scanner와 BufferedReader를 이해하는 가장 기본적인 개념은 그 역할입니다.
- Scanner: Parse (파싱) 역할.
- 사용자가 입력한 텍스트를 토큰(Token) 단위로 잘라서, 개발자가 원하는 특정한 타입의 데이터로 변환해 반환합니다. (예: "123"을 int로 변환)
- BufferedReader: Read (읽기) 역할.
- 사용자가 입력한 데이터 자체를 별도의 가공 없이 그대로 메모리에 읽어 들입니다.
Scanner vs. BufferedReader 4가지 차이점 비교
이러한 근본적인 역할 차이는 네 가지 주요 성능 및 기능 차이로 이어집니다.
1. 데이터 타입 유연성 (가장 큰 차이!)
| 구분 | Scanner | BufferedReader |
| 타입 변환 | 🟢 원하는 타입으로 즉시 파싱 가능 | 🔴 무조건 String으로 읽음. 별도 형 변환 필수 |
| 주요 함수 | nextInt(), nextDouble(), next() 등 다양한 함수 제공 | readLine() 함수만 사용 (항상 문자열 반환) |
Scanner는 nextInt(), nextLong(), nextFloat() 등 원하는 타입으로 직접 파싱할 수 있어 코드가 간결해지는 장점이 있습니다.
반면, BufferedReader는 String으로만 읽어오기 때문에 숫자 등으로 사용하려면
Integer.parseInt()와 같은 추가적인 형 변환 코드 작성이 불가피하다.
2. 메모리 사용 효율성 (버퍼 크기 차이)
두 클래스는 데이터를 효율적으로 처리하기 위해 버퍼(Buffer)라는 임시 저장 공간을 사용합니다.
- BufferedReader: 8KB의 큰 버퍼 메모리 사용
- Scanner: 1KB의 작은 버퍼 메모리 사용
따라서 많은 양의 데이터를 입력받아야 하는 환경(예: 알고리즘 문제 풀이, 대용량 파일 처리)에서는 버퍼 크기가 큰 BufferedReader가 훨씬 효율적입니다. 다만, BufferedReader는 일단 더 큰 메모리를 할당하고 시작한다는 점은 인지해야 합니다.
3. 멀티스레드 환경 안정성 (Thread Safety)
| 구분 | Scanner | BufferedReader |
| 안전성 | 🔴 Thread-unsafe (안전하지 않음) | 🟢 Thread-safe (안전함) |
| 동기화 | 동기화 지원 안 함 (싱글스레드용) | 동기화 지원 |
BufferedReader는 내부적으로 동기화(Synchronization)를 지원하기 때문에 멀티스레드 환경에서도 안전하게 데이터를 공유하고 사용할 수 있습니다. Scanner는 동기화를 지원하지 않아 여러 스레드가 동시에 접근할 경우 문제가 발생할 수 있습니다.
4. 실행 속도 및 성능 (CPU 효율성)
결론적으로, BufferedReader가 Scanner보다 실행 속도가 빠르다.
이유는 CPU가 입출력을 처리하는 방식에 있습니다.
- Scanner: 정규식을 이용해 토큰을 파싱하는 복잡한 로직이 포함되어 있으며, 비교적 자주 입출력 처리를 시도합니다.
- BufferedReader: 데이터를 버퍼에 충분히 쌓아두었다가 버퍼가 가득 차거나 개행 문자(\n)가 발생할 때만 한 번에 입출력을 처리합니다.
CPU는 문자가 입력될 때마다 하나하나 입출력을 처리하는 것보다, 데이터를 모아서 한 번에 처리하는 것이 훨씬 효율적입니다. 따라서 입력량이 많을수록 BufferedReader가 훨씬 CPU 부하가 적고 빠르게 데이터를 처리합니다.
요약 및 선택 가이드
| 상황 | 추천 클래스 | 이유 |
| 간단한 사용자 입력, 타입 변환이 편해야 할 때 | Scanner | 다양한 nextTpye() 함수로 코드가 간결 |
| 대용량 입력, 성능이 중요할 때 (알고리즘) | BufferedReader | 8KB 버퍼, 빠른 실행 속도, CPU 효율성 |
| 멀티스레드 환경에서 안전성이 중요할 때 | BufferedReader | Thread-safe 지원 (동기화) |
개발 상황에 맞춰 두 클래스의 장단점을 고려하여 현명하게 선택하면 좋다.
'Java' 카테고리의 다른 글
| [Java] Primitive type(원시타입) vs. Reference type(참조타입) (3) | 2025.08.30 |
|---|---|
| [Java] 진법 변환 정리 (n진수 <-> 10진수) (0) | 2025.08.30 |
| [Java] Integer.valueOf()와 Integer.parseInt()의 차이 (1) | 2025.08.20 |
| [Java] 자주 쓰이는 이클립스 단축키 (1) | 2025.07.15 |
| [JAVA] 빌더 패턴(Builder Pattern)을 사용해야 하는 이유 (1) | 2025.05.24 |