언어 공부/자바 공부

(JAVA / 자바) Scanner 와 Bufferedreader

코메인 2022. 1. 23. 14:25

안녕하세요~ 코딩하는 코알못 코메인입니다.

 

이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다.

 

자바에서 입력은 scanner와 bufferedreader가 있다.

 

우선 각자의 특성과 장점, 단점을 보자면

-scanner-

▶ java.util.Scanner 클래스

▶ 데이터 형을 받기 편하다.(문자열로 받는건 같지만 입력하면서 바로 형변환이 일어난다.)

▶ 입력값의 경계로 공백, 엔터 모두 인식이 가능하다.

IOException을 숨긴다.

▶ 동기화 되지 않는다.

▶ buffer 사이즈 1024

 

-bufferedreader-

▶ Java.io.BufferedReader 클래스

▶ 데이터가 문자열로 먼저 저장되기 때문에 형변환 필수

▶입력값이 엔터만 인식하기때문에 한 라인에 여러가지 입력하고 싶으면 stringtokenize 필수

   (stringtokenize없이 입력하면 공백을 문자열로 인식)

IOException을 던져야 한다.(throws) 

▶입력과 동시에 동기화 된다.

▶ buffer 사이즈 8192

 

얼핏보면 bufferedreader가 더 좋아보이지 않는다. 하지만 이 두 방식의 큰 차이는 속도의 차이가 있는데 이 차이가 장 단점을 다 뒤집을 만큼의 큰 차이다.

일단 직관적으로 속도 차이를 볼 수 있는 자료를 하나 보여주겠다.

누가 봐도 확실한 속도 차이가 존재한다.

그럼 이제 여기서 왜 bufferedreader가 빠른가를 확인해보겠다.

 

bufferedreader는 기존의 inputstreamreader에 버퍼링이 추가된 class이다.

기존의 inputstreamreader는 문자열을 한글자씩 읽어왔었지만 여기에 buffer를 추가하므로써 문자열을 한번에 저장하고 필요할 때 꺼내 올 수 있게 되었다.

읽을면서 출력해야하는 것보단 일단 저장하고 필요할때 출력만 하면 되기 때문에 속도가 빨라지고 부하가 적다.

 

이제 마지막으로 직접 코드를 만들어보자.


-scanner-

import java.util.Scanner;

public class scanner {

	//IOException을 던질 필요 없음
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//형 변환을 따로 안해줘도 알아서 int형으로 저장된다.
        	//변수 형태를 double로하고 싶으면 sc.nextDouble();로 하면 된다.
		int N = sc.nextInt();

		System.out.println(N);
	}

}

 

-bufferedreader-

 

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

public class bufferedreader {

	//IOException을 던져야함
	public static void main(String[] args) throws IOException{
		//bufferedreader는 설명에서처럼 inputstreamreader에 buffer를 추가하는 것이기 떄문에 
		//inputstreamreader를 받아와야한다.
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		//bufferedreader는 무조건 우선 문자열로 저장하기 때문에 다른 형으로 저장하고 싶으면 형 변환을 해줘야한다.
		int N = Integer.parseInt(br.readLine());
		//문자열로 저장할거면 형변환 없이 그냥 저장하면 된다.
		String S = br.readLine();
		
		System.out.println(N);
		System.out.println(S);
	}

}

기본적으로 이렇게 사용하면 된다. 하지만 위에서 말했 듯 bufferedreader는 엔터만 받기 때문에 문자열이 아닌 정수형이나 실수 형에 저장할 때는 각자 라인마다 변수를 지정해주고 입력 받아야한다. 만약 한 줄에 정수 또는 실수 형 변수를 두개 받고 싶으면 꼭 stringtokenize를 사용해야한다. 없이 그냥 공백 주고 입력하면 이렇게 컴파일 오류가 뜬다.

 

-bufferedreader / stringtokenizer-

 

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.BufferedReader;

public class bufferedreader {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		//StringTokenizer에 토큰으로 문자열을 나눠 저장했으니 변수에 넣을때는 형변환을 해줘야한다.
		int N = Integer.parseInt(st.nextToken());
		int N2 = Integer.parseInt(st.nextToken());
		
		System.out.println(N);
		System.out.println(N2);
	}

}

오류 없이 잘 출력되는 것을 볼 수 있다.

 


이렇게 BufferedReader와 Scanner를 간략하게 알아봤습니다.

혹시 보시다가 잘못된 부분이 있다면 가감없이 댓글로 알려주시면 참고 후 수정 하겠습니다~

감사합니다~