ToBe끝판왕

[ JAVA ] 입출력 / Scanner / BufferedReader / InputStream 본문

■ 공부 기록/개념 정리

[ JAVA ] 입출력 / Scanner / BufferedReader / InputStream

업그레이드중 2022. 5. 16. 21:04
반응형

알고리즘 문제를 풀 때

시간제한이 걸려있는 문제들 관련해서


입출력 문제에 있어서 자주 언급되는 Scanner와 BufferedReader에 대해 정리해보려 한다.

 


 

Scanner 클래스

 

•  java.util.Scanner ; ( import )

 

•  데이터형을 받기 편하다.

   - 데이터 타입이 입력받는 시점에 결정되기 때문에 별도의 Casting 필요 X

   - Scanner는 정수 값으로 int / short / long 읽어 들일 수 있다.

   - Scanner는 소수 값으로 float / double 읽어 들일 수 있다.

   - Scanner는 String값도 읽을 수 있다.

 

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

 

•  동기화되지 않는다.

 

•  정규식을 사용하여 문자열을 구분하여 분석하는 Parsing( 파싱 )이 가능하다.

   - Scanner의 경우 int / long / short / float / double의 경우

     nextInt( ) , nextLong( ) , nextShort( ).nextFloat( ) , nextDouble( )과 같은 함수를 사용하지만

     BufferedReader는 오직 문자열 값만을 읽기 때문에 readLine( ) 함수만을 사용

 

ex)

import java.util.Scanner;

public class Study {

	public static void main( String[] args ) {
    	
        Scanner sc = new Scanner( System.in );
        String inpuit = sc.nextLine();
        int num = Integer.parseInt( input );
        
        System.out.println( num );
    }
}

 

 

 

BufferedReader 클래스

 

•  일정한 크기의 데이터를 한 번에 읽어와 버퍼에 보관한 후, 사용자의 요청이 있을 때 버퍼에서

   데이터를 읽어오는 방식으로 동작한다.

 

•  java.io.BufferedReader; ( import )

 

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

 

•  입력값이 엔터만 인식, 한 Line에 여러 가지 입력하고 싶다면 stringtokenize 필수이다.

 

•  IOException( 예외처리 )를 던져야 한다. 

 

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

   - 여러 스레드 간에 Scanner는 공유가 불가능하지만, BufferedReader는 공유할 수 있다.

 

ex)

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

public class Study {
	
    public static void main( String[] args ) {
    	
        BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
        String Str = br.readLine();
        int i = Integer.parseInt( br.readLine() );
        
        System.out.println( "String : " + Str );
        System.out.println( "Int : " + i );
    }
}

 

 

※  InputStreamReader

   - 가장 기본이 되는 입출력 클래스

 

   - 가장 기본이 되는 입력 스트림으로 바이트 단위의 데이터를 보낸다.

     InputStream의 입력 메서드인 read( )는 1byte 단위로 읽는다.

 

   - 문자열을 Character 단위( 한 글자 단위 )로 읽어 들인다.

     긴 문자열을 읽어 들일 때, 비효율적이므로 BufferedReader가 존재한다.

     즉, BufferedReadr는 InputStreamReader에 버퍼링 기능이 추가된 클래스이다.

 

 

 

차이점

 

•  두 방식의 큰 차이는 바로 속도에 있다.

 

 

 

 

 

반응형
Comments