[Java] Scanner vs BufferedReader

G·2024년 6월 17일
0

Java

목록 보기
9/21
post-thumbnail

Scanner

Scanner란?

Scanner 클래스는 입력받은 데이터(byte)를 다양한 타입으로 변환하여 반환하는 클래스입니다. Scanner 클래스는 java.util.* 패키지에서 import하여 사용해야 합니다.


BufferedReader

BufferedReader란?

BufferedReader 클래스는 간단히 말하면 버퍼를 이용하여 데이터의 입력을 다루는 클래스입니다.

입출력에서의 버퍼란 입출력이 발생할 때마다 데이터를 하나하나 전송하지 않고 차례대로 모아두었다가 특정 경계값이 들어오면 한번에 데이터를 전송할 수 있도록 데이터를 보관하는 임시 저장 공간을 의미합니다.


Scanner vs BufferedReader

입력 경계값

  • Scanner 클래스를 통해 입력받을 때는 띄어쓰기(" ")와 개행 문자("\n")를 경계로 입력값을 인식합니다.

  • BufferedReader 클래스개행 문자("\n")만 경계로 입력값을 인식합니다.

패키지

  • Scanner 클래스java.util 패키지에 속하며, java.util.Scanner를 import하여 사용합니다.
  • BufferedReader 클래스java.io 패키지에 속하며, java.io.BufferedReader로 import하여 사용합니다. 따라서 파일, 네트워크 등 다양한 입출력 소스에서 데이터를 읽을 때 주로 사용됩니다.

버퍼 사이즈

  • Scanner 클래스는 내부적으로 약 1KB의 작은 버퍼를 사용하며, 버퍼 크기를 직접 제어할 수 없습니다.
  • BufferedReader 클래스는 기본적으로 8KB(8192 문자)의 버퍼 크기를 사용하며, 필요에 따라 사용자 정의 버퍼 크기를 설정할 수 있습니다.
  • BufferedReader 클래스는 기본적으로 8KB(8192 문자)의 버퍼 크기를 사용합니다. 이는 입출력 작업의 빈도를 줄여 성능을 향상시킵니다. 필요에 따라 사용자 정의 버퍼 크기를 설정할 수 있습니다.

처리 속도

  • Scanner 클래스는 데이터를 읽어들이면서 정규 표현식을 사용하여 다양한 형식의 데이터(int, double, String 등)를 파싱합니다. 이는 유연성을 제공하지만, 추가적인 처리 오버헤드가 발생할 수 있습니다.
  • BufferedReader 클래스는 데이터를 효율적으로 버퍼링하여 한 번에 많은 양의 데이터를 읽어들이고, 이를 라인 단위로 반환합니다. 버퍼링을 통해 입출력 작업의 빈도를 줄여 성능을 높입니다. 기본적으로 더 큰 버퍼를 사용하기 때문에, 대량의 데이터를 처리할 때 더 빠르게 데이터를 읽어올 수 있습니다.

왜 BufferedReader가 더 좋은가?

  1. 성능 최적화: BufferedReader는 기본적으로 더 큰 버퍼(8KB)를 사용하여, 한 번에 많은 데이터를 읽어들일 수 있습니다. 이를 통해 입출력 작업의 빈도를 줄여 성능을 최적화합니다. 특히, 대용량 파일을 읽을 때 성능 차이가 더욱 두드러집니다.

  2. 입출력 효율성: BufferedReader는 단순히 텍스트를 줄 단위로 읽어들이기 때문에, 정규 표현식을 사용하여 데이터를 파싱하는 Scanner에 비해 처리 과정이 단순합니다. 이로 인해 오버헤드가 적고, 더 효율적인 데이터 처리와 전송이 가능합니다.

  3. 유연한 버퍼 크기 설정: BufferedReader는 기본 버퍼 크기(8KB)를 제공할 뿐만 아니라, 필요에 따라 사용자 정의 버퍼 크기를 설정할 수 있습니다. 이는 상황에 맞게 최적화된 버퍼 크기를 사용할 수 있도록 해줍니다.

  4. 입출력 작업의 최적화: BufferedReader는 입력 소스(파일, 네트워크 등)와의 상호 작용 횟수를 줄여, 전체적인 입출력 작업의 효율성을 높입니다. 이는 특히 네트워크와 같이 입출력 비용이 높은 환경에서 유리합니다.

기본형 코드

// Scanner
import java.util.Scanner;

public class ScannerExample {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        System.out.print("Enter an integer: ");
        int num = scanner.nextInt(); // 정수 입력 받기
        
        System.out.println("You entered: " + num);
        
        scanner.close();
    }
}


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

public class BufferedReaderExample {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
        System.out.print("Enter an integer: ");
        String input = reader.readLine(); // 문자열로 입력 받기
        int num = Integer.parseInt(input); // 문자열을 정수로 변환
        
        System.out.println("You entered: " + num);
        
        reader.close();
    }
}
profile
기!술! 블로그

0개의 댓글