솔솔

[Java] Scanner vs BufferedReader 차이점 본문

나의보물들/Java

[Java] Scanner vs BufferedReader 차이점

솔솔하네 2025. 2. 15. 14:34
반응형

🍀 Scanner 


특징

  • 다양한 타입(int, double, String 등)으로 직접 변환 가능
  • 공백(띄어쓰기, 개행) 기준으로 자동 구분하여 입력 처리
  • 내부적으로 정규 표현식을 사용하기 때문에 다소 느림

사용법 

import java.util.Scanner;

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

        String str_input = sc.next(); // 문자열 입력 받기
        int int_input = sc.nextInt(); // 정수 입력 받기
        double double_input = sc.nextDouble(); // 실수 입력 받기
        
        sc.close();
    }
}

 

 

🍀 BufferedReader 


특징

  • 버퍼링 기반의 입력 도구
  • 입력 속도가 빠름 (대량의 데이터 처리할 때 유리)
  • 입력값이 항상 문자열(String)으로 반환되므로, 타입 변환을 직접 해야 함
  • readLine()은 한 줄만 읽기 때문에 공백을 포함한 여러 개의 값을 받을 때 직접 split()을 사용해야 함

사용법 

import java.io.BufferedReader;
import java.io.IOExceiption;
import java.io.InputStreamReader;

public class Input {
	public static void main(String[] args) {
    	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        String str_input = br.readLine(); // 한 줄 입력 받기
        int int_input = Integer.parseInt(br.readLine()); // 문자열을 정수로 변환
        double double_input = Double.parseDouble(br.readLine()); // 문자열을 실수로 변환
        
    }
}

 

 

 

🍀 Scanner vs BufferedReader 속도 테스트


*  100000개의 수작가 들어가 있는 txt파일을 만들어 테스트를 진행하였다.

 

1. Scanner

public class SpeedTest {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(new File("input.txt"));

        long startTime = System.nanoTime();  // 시작 시간 측정

        int N = scanner.nextInt();
        for (int i = 0; i < N; i++) {
            int num = scanner.nextInt();  // 숫자 하나씩 읽기
        }

        long endTime = System.nanoTime();  // 종료 시간 측정
        System.out.println("Scanner 실행 시간: " + (endTime - startTime) / 1_000_000.0 + " ms");

        scanner.close();
    }
}

 

 

2. BufferedReader

public class SpeedTest {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("input.txt"));

        long startTime = System.nanoTime();  // 시작 시간 측정

        int N = Integer.parseInt(br.readLine());  // 첫 줄 읽기
        String[] numbers = br.readLine().split(" ");  // 한 줄 읽고 공백 기준으로 분리

        for (String num : numbers) {
            int value = Integer.parseInt(num);  // 숫자로 변환
        }

        long endTime = System.nanoTime();  // 종료 시간 측정
        System.out.println("BufferedReader 실행 시간: " + (endTime - startTime) / 1_000_000.0 + " ms");

        br.close();
    }
}

 

🤔 실행 결과 비교

테스트 방식 실행 시간 (100,000개 정수 입력)
Scanner 약 71ms
BufferedReader 약 23ms

 

BufferedReader 가 Scanner 보다 3배 빠르다는것을 알 수 있었음

 

 

🍀 Scanner vs BufferedReader 차이점


비교 항목 Scanner BufferedReaderr
속도 상대적으로 느림 빠름 (버퍼링 처리)
입력방식 정수, 실수, 문자열 등 다양한 타입 입력 가능 한 줄(String) 단위 입력
입력 처리량 적은 양의 데이터에 적합 많은 데이터 처리에 적합
메서드 nextInt(), nextDouble(), nextLine() 등 다양한 메서드 제공 readLine() (String 반환)
예외 처리 예외 처리 불필요 IOException 필요
공백처리 자동으로 공백을 기준으로 토큰 분리 split()을 직접 사용해야 함

 

🤔 결론

데이터가 많을 때는 BufferdReader가 좋다