자바에서 문자열을 입력받는 대표적인 방법에는 Scanner와 BufferedReader가 있다.
오늘 두 개의 차이점에 대해서 알아보려고한다.
자바를 한 번이라도 접해봤으면 Scanner는 사용해봤을거라고 생각된다.
알고리즘을 풀어봤다면 BufferdReader 또한 사용해봤을것이다.
기본 문법
[Scanner]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
System.out.println(input);
}
}
JDK1.5부터 java.util 패키지에 포함된 클래스로 데이터를 입력받은 즉시 사용자에게 전송하고, 별도의 예외 처리를 명시할 필요가 없다.
또한, 데이터 타입이 입력받은 시점에서 결정되므로 별도의 변환이 필요하지 않다.
[BufferedReader]
import java.io.*
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputstreamReader(Systsem.in));
String input = br.nextLine();
System.out.println(input);
}
}
InputStreamReader은 문자열을 char 단위로 한 글자씩 읽어들인다.
한 문자씩 읽어들이는 것은 상당히 비효율적이다. 이점을 보완하기 위해 나온 것이 BufferdReader 이다.
사용자가 요청할 때마다 데이터를 읽어오는 것이 아닌 일정한 크기의 데이터를 한 번에 읽어와서 버퍼에 보관 후, 버퍼가 가득 차거나, 개행 문자를 만날 경우 버퍼에서 데이터를 읽어오는 방식이다. 그렇기 때문에 속도가 빠르고 시간 부하가 적다
단점으로는 String 타입으로만 읽어드릴 수 있어서 int, double 등으로 형변환을 직접 해줘야한다.
▶ 버퍼
데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역
BufferedReader | Scanner | |
버퍼 사이즈 | 8192 | 1024 |
Syncronized | O | X |
문자열 파싱 | 단순히 읽어드림 | 문자열 파싱 가능 |
예외처리 | IOException 던짐 | IOException 숨김 |
Thread-safe | O | X |
속도 비교
BufferedReader와 Scanner의 가장 큰 차이는 속도다.
백준 사이트에서 다양한 언어로 평균 속도를 실험해봤고, 아래의 표에서 볼 수 있듯이 확연한 차이가 있다.
실제로 알고리즘 문제를 풀다보면 Scanner로 풀면 시간 초과가 발생하지만 BufferedReader로 바꿔서 풀 경우에 통과하는 경우가 많다.
'개발 & 데이터베이스 > JAVA' 카테고리의 다른 글
자바 NumberFormatException 발생 원인 및 예외 처리 (0) | 2023.04.19 |
---|---|
이클립스 오류 svn:E160024 Some of selected resources where not commited. (0) | 2023.03.28 |
자바 카운팅 정렬 Counting Sort 계수 정렬 완벽 이해하기 (1) | 2023.03.16 |
자바 Comparable과 Comparator 차이점 (0) | 2023.02.08 |
자바 오류 source release 11 requires target release 11 해결 (0) | 2023.01.12 |