[Java]Scanner 와 BufferedReader

김일한·2023년 2월 1일

Java

목록 보기
1/1
post-thumbnail

Scanner

입력받은 데이터를 다양한 타입으로 변환하여 반환하는 클래스
✓java.util 패키지
✓공백(띄어쓰기) 및 개행(줄 바꿈)을 기준으로 읽는다.('','\t','\r','n' 등)
✓입력받는 시점에서 데이터 타입이 결정되어 사용자가 별도의 형변환 작업을 수행할 필요가 없다.
✓버퍼의 사이즈가 1024byte(1KB) 이다.
✓ UnChecked(Runtime) Exception - 명시적인 예외처리를 할 필요가 없다.

BufferedReader

데이터를 한번에 읽어 버퍼에 보관 후 버퍼에서 데이터를 읽어오는 방식의 클래스
✓java.io 패키지
✓입력은 한 줄 단위로 받기 때문에 모든 입력 데이터를 String으로 인식한다.
✓버퍼의 사이즈가 8192kbyte(8KB)이다.
✓Checked Exception으로 반드시 예외 처리를 수행해야 한다.

Scanner 와 BufferedReader의 차이점

1. 속도차이

BufferedReader

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

public class Main{
	public static void main(String[] args) throws Exception {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		in.readLine();
		int t;
		long st2 = System.currentTimeMillis();
		for(int i=0;i<10000;i++){
			t = Integer.parseInt(in.readLine());
		}
		System.out.println("소요시간 "+(System.currentTimeMillis() - st2)+"ms");
	}
}

Scanner

import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t;
		sc.nextLine();
		long st1 = System.currentTimeMillis();
		for(int i=0;i<10000;i++){
			t = sc.nextInt();
		}
		System.out.println("소요시간 "+(System.currentTimeMillis() - st1)+"ms");
		sc.close();
	}
}


✓ 10000개의 입력값을 받을때 실행시간이 약 0.5초와 0.9초로 위 실행결과만 보면 미세한 차이로 보일 수 있지만 입력값이 많아지거나 다른 연산까지 추가 될 경우를 고려하면 성능차이가 꽤 많이 난다는 것을 알 수 있다.

실제 백준님께서 각 언어와 입력 방법 별 실행시간의 평균 값을 측정한 결과에서도 유의미한 차이를 나타내고 있다!
https://www.acmicpc.net/blog/search/%EC%9E%85%EB%A0%A5+%EC%86%8D%EB%8F%84

2.메모리용량 차이

✓BufferedReader는 버퍼 메모리가 8KB로 Scanner 보다 버퍼 메모리가 크기 때문에 많은 입력을 받을 때 효율적으로 사용할 수 있다.

3.동기화 차이

✓멀티쓰레드는 여러 쓰레드가 같은 프로세스 내의 자원을 공유하기 때문에 서로의 작업에 영향을 줄 수 있다. Scanner는 동기화를 지원하지 않기 때문에 쓰레드 간 Scanner를 공유할 수 없지만 BufferedReader는 동기화가 되기 때문에 멀티쓰레드 환경에서 Scanner에 비해 안전하다.

profile
도전을 즐기는 개발자, 김일한입니다.

0개의 댓글