코린이 시점에서 쓰는
Scanner와 BufferedReader 특징과 차이점입니다-!
여지껏 백준 문제를 풀 때, 항상 Scanner 만 사용했다.
그리고 강의 중에서 Scanner를 많이 사용한다고 했다.
하지만, 역시 코딩을 시작한지 얼마 안된 시점에서,
백준 문제가 풀리지 않을 때, 문제에 대한 감이 안올 때, 다른 사람들의 코드를 보면
Scanner 말고도 BufferedReader를 사용해 푸는 걸 볼 수 있었다.
BufferedReader의 장점은 무엇이며, 어떻게 사용하는 건지 찾아보다
둘을 정리해보려고 생각이 들어 아래와 같이 정리한다.
어떤 사람은 Scanner 클래스를 사용했을 때 시간초과가 나
BufferedReader를 이용해 푸니 해결되었다고 한다.
먼저 알 수 있는점은 BufferedReader가 실행시간이 더 빠르다는 것이다.
Scanner
Scanner 클래스는 입력받은 데이터를 다양한 타입으로 변환해 반환하는 클래스이다.
간단하게 기본형과 String 타입을 정규표현식을 사용해 parse할 수 있다.
여기서 정규표현식이란, nextInt(), nextLong(), nextShort(), nextFloat(), nextDouble() 을 의미한다.
import java.util.Scanner;
Scanner sc - new Scanner(System.in); //Scanner 객체 생성
int N = sc.nextInt(); // 다음에 오는 int가 N으로 입력된다!
***
System.in:
사용자로부터 입력을 받기 위한 입력 스트림으로, Scanner 클래스 뿐만 아니라 다른 입력 클래스도
System.in을 통해 사용자 입력을 받는다.
BufferedReader
데이터를 한번에 읽어온다음 Buffer에 보관 후 Buffer에서 데이터를 읽어오는 방식으로 동작하는 클래스이다.
사용자가 입력한 문자 스트림을 read라고 한다.
Buffer: 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안
일시적으로 해당 데이터를 보관하는 임시 메모리 영역.
주로 입출력 속도 향상을 위해 사용.
import java.io.BufferedReader;
import java.io.InputStreamReader; //문자 기반의 보조 스트림으로 byte기반 스트림을
//문자 기반 스트림으로 연결시켜주는 역할을 한다!
public static void main(String[] args){
BufferedReader br = new BufferedReader(InputStreamReader(System.in));
//!!매개변수로 InputStreamReader를 사용해 객체를 생성!!
String s = br.readLine();
int a = Integer.parseInt(br.readLine());
int b = Integer.parseInt(s);
Scanner vs BufferedReader
1. Scanner가 더 활용범위가 넓다.
BufferedReader는 문자열 String값만 읽지만,
Scanner는 다양한(int, short, long, float, double) 값을 읽을 수 있다.
(그렇기에 백준을 풀 때 더욱 구애받지 않고 Scanner를 사용했던 것 같다.)
2. BufferedReader는 상당히 큰 버퍼를 차지한다.
Scanner는 1KB, BufferedReader는 8KB 버퍼를 차지한다.
즉 많은 입력이 있을 경우에는 BufferedReader가 더 효율적이지만,
적은 입력이 있으면 Scanner를 사용하는 것이 효율적이다.
3. Scanner는 정규식을 사용해 값을 parsing한다.
Scanner는 nextInt(), nextLong(), nextShort(), nextFloat(), nextDouble() 과 같은
함수를 사용해 parsing하지만,
BufferedReader는 오직 readLine()함수만 사용한다.
4. BufferedReader는 동기화를 사용한다.
Scanner는 여러 스레드 간 공유할 수 없고,
BufferedReader는 공유할 수 있다.
즉 BufferedReader는 안전하고 문자열을 더욱 빠르게 입력받을 수 있다.
(입력 속도 차이:
Scanner: 4.8448초
BufferedReader: 0.68586초)
참고자료:
https://velog.io/@langoustine/Scanner-VS-BufferedReader
https://friends-aihaja.tistory.com/entry/1-BufferReader-VS-Scanner-%EC%B0%A8%EC%9D%B4%EC%A0%90