Skills/Java

Scanner & BufferedReader

aoaa 2022. 5. 7. 22:25

 알고리즘에서 Java로 입력을 받을 때 Scanner를 많이 사용합니다. 

Scanner는 공란과 줄바꿈을 입력값의 경계로 사용하며, 입력받은 즉시 자료형이 확정이 됩니다.

 

 반면 BufferedReader는 버퍼를 이용해 입출력을 하는 방식입니다.

 

 하드디스크를 비롯 키보드와 같은 외부 장치의 데이터 I/O는 시간이 걸리는 작업입니다. (CPU의 연산속도가 상대적으로 매우 빠름)

즉 키보드를 누를 때 마다 누른 문자의 정보를 이동시키는 것보다, 메모리에 버퍼를 둬서 데이터를 묶어서 전송하는 것이 더 빠릅니다.

여기서 버퍼는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리 영역입니다.

 

 위에서 설명했듯이, Scanner는 공란과 줄바꿈을 경계로 입력 값을 인식하기 때문에 편리한 점이 있습니다. 

Buffer는 enter(개행)만을 경계로 인식하고 받은 데이터가 String으로 고정되기 때문에 데이터를 따로 가공해야 하지만, 속도가 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<1000000;i++){
			t = sc.nextInt();
		}
		System.out.println("소요시간 "+(System.currentTimeMillis() - st1)+"ms");
		sc.close();
	}
}

 이 코드는 Scanner를 통해 1000000개의 데이터를 입력받는 코드입니다. 

System.currentTimeMillis함수를 이용해 연산속도를 확인해보면 대략 2441ms가 나옵니다.

 

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

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<1000000;i++){
			t = Integer.parseInt(in.readLine());
		}
		System.out.println("소요시간 "+(System.currentTimeMillis() - st2)+"ms");
	}
}

 위는 BufferedReader를 사용한 코드입니다. 대략 452ms 정도 소요됐습니다.

버퍼리더는 한 줄을 통 째로 받는 형식이기 때문에 1 2 3 4 5 6 ... 과 같이 한 줄로 입력이 들어올 때 Scanner에 비해 훨씬 성능이 높아집니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

참조

'Skills > Java' 카테고리의 다른 글

Java - Stack  (0) 2022.05.23
Java - Parameter, Argument  (0) 2022.05.20
Java new 연산자  (0) 2022.05.10
Java 구성 (class, method, instance)  (0) 2022.05.06
Java public static void main(String[] args)의 의미  (0) 2022.05.04