Scanner vs BufferedReader
2024. 10. 7. 21:36ㆍ개발지식/Java
목표
Java에는 외부(클라이언트)에게서 값을 입력받을 수 있는 대표적인 2가지 방법이 있다.
1. Scanner 2. BufferedReader
항상 자바로 알고리즘 풀다보면 입력받을 때 둘의 실행시간 속도가 확연히 차이가 났다.
이번 기회에 둘의 차이를 확실히 알고 넘어가는 게 좋을 거 같아 정리한다.
1. Scanner 특징
- 입력받을 경우, 공백 및 개행 기준으로 읽는다
- java.utill 패키지에 속한 클래스이다.
- 원하는 타입으로 읽을 수 있다.
- 버퍼의 기본 크기는 1KB(1024Byte)이다.
2. BufferReader 특징
- Enter만 경계로 인식함
- 데이터를 한 번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스이다.
- java.io 패키지에 속한 클래스이다.
- String으로만 데이터 인식
- 버퍼의 기본 크기는 8KB(8192Byte)이다.
장점 : 알고리즘의 시간을 줄일 수 있다.
Scanner 작성법
import java.util.scanner;
Scanner sc = new Scanner(System.in);
String st = sc.nextLine();
System.in을 통해 Scanner 객체를 생성한다.
BufferedReader 작성법
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public static void main(String[] args) throws IOException {
BufferReader br = new BufferedReader(InputStreamReader(System.in));
String st = br.readLine();
int a = Integer.parseInt(br.readLine());
int b = Integer.parseInt(st);
}
BufferedReader는 매개변수로 InputStreamReader를 사용하여 객체를 생성한다.
InputStreamReader
문자 기반으로 보조 스트림으로써 바이트 기반 스트림을 문자 기반 스트림으로 연결시켜 주는 역할을 한다.
시스템의 표준 입력이나 파일 입력 같은 바이트 기반 스트림을 입력 받는다.
3. Scanner 와 BufferedReader 비교
3-1) 입력 방식
- Scanner: 입력된 데이터를 파싱하여 token 단위로 쪼개어 읽어온다
- BufferedReader: 입력 데이터를 그래도 읽어오기만 한다
"간단한 사용자 입력을 처리할 경우 Scanner가, 대량의 데이터나 파일 처리가 필요할 경우 BufferedReader가 더 적합하다"
3-2) 타입
- Scanner: Scanner는 원하는 타입으로 읽고 파싱할 수 있다.
- BufferedReader: readLine()함수, String 형식으로만 읽고 저장하기에 형변환을 위한 추가적인 코드작성이 불가피하다.
" Scanner는 BufferedReader보다 타입에 구애 받지 않는다.
3-3) 스레드 안전성
- Scanner: 기본적으로 스레드 안전하지 않기 때문에 공유할 경우 주의가 필요하다.
- BufferedReader: 동기화를 지원하여 멀티스레드 환경에서 안전하게 사용할 수 있다.
"BufferedReader는 Scanner보다 안전하다"
3-4) 속도
- Scanner: Scanner의 경우에는 정규식을 사용하여 입력을 받는다.
- BufferedReader: BufferedReader는 문자열을 더욱 빠르게 입력받을 수 있다.
"BufferedReader가 Scanner보다 실행속도가 빠르다"
3-5) 메모리 용량
- Scanner: 버퍼 메모리 1KB
- BufferedReader: 버퍼 메모리 8KB
"BufferedReader는 Scanner보다 효율적인 메모리 용량을 갖고 있다."
'개발지식 > Java' 카테고리의 다른 글
좋은 객체 지향 설계의 5가지 원칙(SOLID) (1) | 2023.12.30 |
---|---|
[Java] 변수와 자료형 (1) | 2023.12.20 |
[Java] JDK, JRE, JVM 이란? (자바 개발 환경 구축) (0) | 2023.12.20 |
[Java] Java 11 vs Java 17 (0) | 2023.11.11 |