개발 & 데이터베이스/JAVA

자바 Scanner vs BufferedReader 차이점

K.두부 2023. 3. 26. 22:57
반응형

자바에서 문자열을 입력받는 대표적인 방법에는 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로 바꿔서 풀 경우에 통과하는 경우가 많다.

 

백준에서 제공하는 속도 비교

 

반응형