ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (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를 간략하게 알아봤습니다.

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

    감사합니다~

    '언어 공부 > 자바 공부' 카테고리의 다른 글

    (JAVA / 자바) 추상클래스(abstract)  (0) 2022.06.25
    (JAVA / 자바) EOF 에러 해결 방법  (0) 2022.02.19

    댓글