본문 바로가기

Language/JAVA

Scanner vs BufferedReader

Java에서 표준 입력을 통해 입력을 받는 방법은 뭐가 있을까요?

대표적으로 JDK 1.5에서 제공하는 Scanner 클래스를 이용하는 방법과

JDK 1.1부터 제공하고 있었던 BufferedReader 클래스를 이용하는 방법이 있어요.

물론 그 외의 다양한 방법이 있겠지만 키보드를 통해 입력받는 두 클래스에 대해서 먼저 비교해보도록 할게요.

 

Scanner와 BufferedReader는 어떤 차이가 있을까요?

먼저 입력을 받을 수 있는 자료형의 종류가 달라요.

Scanner는 문자(char), 문자열(String), 숫자(int, float, double, ...), 논리형(boolean)등 다양한 형태의 입력을 받을 수 있지만,

BufferedReader는 문자열(String)만 입력받을 수 있어요.

물론 read()를 통해 문자 하나만 입력받는 것도 가능해요.

이런 점에서 다양한 형태를 입력받을 수 있는 Scanner를 자주 사용하곤 해요

 

다음으로는 데이터 처리 속도에서 차이가 있어요.

  BufferedReader Scanner
Buffer Size 8192 1024
Parsing 단순 읽기 정규식을 통해 처리 후 파싱
동기화 O X
예외처리 IOException 발생 -

Scanner의 경우 할당된 Buffer의 크기가 1024 byte이고,

정규식을 통해 입력한 데이터를 받아들이는(Parsing) 과정을 거치는데요.

이에 반해 BufferedReader는 8192 byte의 넉넉한 Buffer 공간이 할당되어 있고,

입력한 데이터를 가공없이 입력한 그대로 받아들이기 때문에

Scanner보다 더 빠른 속도로 데이터를 처리해요.

 

그러나 BufferedReader는 여러 Thread에서 공유가 가능한데

이런 경우 Scanner보다 느릴 수 있어요.

Scanner는 Single Thread를 사용하기 때문에 공유가 되지 않거든요.

그럼에도 처리 속도 측면에서 BufferedReader가 효율적일 수 있으니

성능이나 팀원간의 협업, 요구조건에 따라 선택해서 사용하면 돼요.

 

그럼 BufferedReader는 언제 사용할까요?

앞에서 말한 것처럼 단순히 읽기만 하기 때문에 처리 속도가 빨라요.

그래서 주로 대량의 데이터를 빠르게 처리할 때 많이 사용하고 있어요.

나중에 처리 속도를 비교한 화면을 캡처해서 보여주도록 할게요.

지금은 더 빠르다는 정도만~

 

그럼 BufferedReader를 사용했을 때 단점은 없을까요?

Scanner Class는 java.util.Scanner만 import 하면 돼요.

하지만 bufferedReader를 사용하기 위해서는 java.io.*에서 제공하는 BufferedReader뿐만 아니라
InputStreamReader Class도 Import 해줘야 돼요.

그리고 BufferedReader는 예외가 발생할 수 있도록 구현되어 있으니...

IOException도 Import를 해줘야 돼요.

물론 빠르다는 장점이 있지만 예외 처리 등 개발자가 작업해야 할 부분이 더 늘어난다는 단점이 있어요.

 

그럼 Scanner와 BufferedReader의 구현 방법은 예제를 통해 알아볼까요?


import java.util.Scanner;

/**
* Scanner Class를 이용한 입력 구현
*/
public class Main {
        public static void main(String[] args) {
                Scanner scan = new Scanner(System.in);
                /* 입력 값을 처리해주는 코드 작성 */
                scan.close();
        }
}

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* BufferedReader Class를 이용한 입력 구현
*/
public class Main {
        public static void main(String[] args) {
                BufferedReader br = null;
                try {
                        br = new BufferedReader(new InputStreamReader(System.in));
                        /* 입력 값을 처리해주는 코드 작성 */
                } catch(IOException e) {
                        /* 예외 처리 구현 */
                } finally {
                        /* 자원을 사용하는 중인 경우 자원 반환 */
                        /* 그 외의 추가 처리에 대한 기능 구현 */
                        br.close();
                }
        }
}

 

딱 봐도 BufferedReader로 구현한 소스코드가 더 길고 복잡하네요.

그렇지만 Scanner와 BufferedReader 각각의 장점이 있으니

개발할 때 잘 어떤 방식이 더 효율적인지 생각해서 구현해봅시다.

'Language > JAVA' 카테고리의 다른 글

‘==’ vs equals() vs hashcode()  (0) 2022.05.27
[JAVA] UUID  (0) 2022.05.25
0. JAVA란?  (0) 2020.01.08