본문 바로가기
Language/JAVA

Scanner vs BufferedReader

by 이혤 2025. 9. 30.

Java 로 백준 알고리즘 풀면서, 처음 풀때부터 차이를 정리하고 가고 싶었으나 

이제야 정리하게 됐습니다! 

 

둘의 차이가 몰까요

 

  • 실행시간 차이 
  • 효율적인 코드 작성 

 

Scanner 란?

 - Scanner 클래스는 입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스입니다.
 - 간단하게 기본형과 String 타입을 정규표현식을 사용해 파싱(parse)할 수 있습니다.

Scanner 의 특징 

  • java.util 패키지에 속한다. (import java.util.Scanner)
  • **공백(띄어쓰기) 및 개행(줄 바꿈)**을 기준으로 데이터를 읽는다.
  • 원하는 타입(int, double, String 등)으로 입력을 받을 수 있다.
  • 버퍼의 크기는 1024byte(1KB)이다.
  • Unchecked(Runtime) Exception을 사용하므로 별도의 예외 처리를 명시하지 않아도 된다.
  • Thread unsafe 하므로 멀티스레드 환경에서 문제 발생 가능성이 있다.
  • 데이터를 입력받을 때마다 즉시 사용자에게 전달되므로 입력할 때마다 전송되어 속도가 느린 편이다.

 

BufferedReader 란 ?

 - BufferedReader 클래스는 데이터를 한 번에 읽어와 버퍼에 저장한 후 버퍼에서 데이터를 읽어오는 방식으로 동작합니다.
   즉, 사용자가 입력한 문자 스트림을 읽는(read) 클래스입니다.

BufferedReader의 특징 

 

  • java.io 패키지에 속합니다. (import java.io.BufferedReader)
  • 데이터를 파싱하지 않고 String으로만 읽어옵니다.
  • 버퍼의 크기는 8192byte(8KB)입니다.
  • Checked Exception을 반드시 처리해야 합니다. (IOException → throws 선언하거나 try/catch로 처리)
  • Thread safe 성질을 가지므로 멀티스레드 환경에서도 안전합니다.
  • 버퍼가 가득 차거나 개행 문자가 나타나면, 버퍼의 내용을 한 번에 전달하므로 Scanner보다 입력 처리 속도가 빠릅니다

 

그럼 이제 각각의 예제를 살펴볼까요?! 

 

Scanner 예제

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 정수 2개 입력받기
        int a = sc.nextInt();
        int b = sc.nextInt();

        // 문자열 1개 입력받기
        String s = sc.next();

        System.out.println("정수 합: " + (a + b));
        System.out.println("입력된 문자열: " + s);

        sc.close();
    }
}

 

📌 특징:

  • nextInt(), next(), nextDouble() 처럼 원하는 타입으로 직접 입력 가능
  • 공백( ), 엔터(\n) 상관없이 값 단위로 잘라서 읽어옴

BufferedReader 예제

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 한 줄 통째로 입력받기
        String line = br.readLine();
        System.out.println("입력된 한 줄: " + line);

        // 공백으로 구분된 정수 입력 처리
        StringTokenizer st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());

        System.out.println("정수 합: " + (a + b));
    }
}

📌 특징:

  • readLine() → 한 줄 전체를 문자열로 읽어옴
  • 숫자는 Integer.parseInt()로 변환해야 함
  • 공백 구분하려면 StringTokenizer나 split()을 사용해야 함

 

구분 Scanner / BufferedReader

패키지 java.util.Scanner java.io.BufferedReader
입력 단위 공백/개행 기준으로 토큰 단위 입력 가능 한 줄 단위로 문자열 입력
데이터 변환 nextInt(), nextDouble(), next() 등 → 원하는 타입으로 바로 읽음 문자열만 입력 → 숫자는 Integer.parseInt() 같은 파싱 필요
예외 처리 Unchecked Exception (Runtime) → 따로 명시 안 해도 됨 Checked Exception (IOException) → throws나 try-catch 필요
버퍼 크기 1KB (1024byte) 8KB (8192byte)
속도 상대적으로 느림 (입력받을 때마다 처리) 빠름 (버퍼에 모았다가 한 번에 전달)
멀티스레드 안전성 Thread-unsafe Thread-safe
주 사용 용도 간단한 입력, 소규모 문제 풀이 대용량 입력, 빠른 속도 필요한 문제 (BOJ, 알고리즘 대회 등)

 

 

Scanner vs BufferedReader 사용 시나리오

✅ Scanner를 쓰는 경우

  • 코드가 간단해야 할 때
  • 입력 크기가 작을 때 (예: 간단한 연습문제, 소규모 콘솔 입력)
  • 정수, 실수, 문자열 등 다양한 타입을 바로 받고 싶을 때 (nextInt(), nextDouble() 등)
  • 속도보다는 편리함이 중요한 상황

✅ BufferedReader를 쓰는 경우

  • 입력 데이터가 많을 때 (예: 알고리즘 문제, 대용량 데이터 처리)
  • 속도가 중요한 상황 (특히 온라인 저지, 코딩테스트)
  • 문자열을 통째로 읽고 직접 파싱할 수 있을 때 (StringTokenizer 또는 split)
  • 예외 처리를 직접 관리할 수 있을 때

👉 정리하면,

  • 작은 프로그램/학습용: Scanner
  • 알고리즘 문제/대용량 데이터 처리: BufferedReader

 

곧 대학교 때 봤던 Java 전공 책 다시 한번 보고 공부할 생각입니다.