본문 바로가기

이것저것 알게된 것

Scanner와 BufferedReader


백준 1325번 문제에서 시간 초과의 문제로 고민하다가 Scanner와 BufferedReader의 차이점에 대해 알게 되었다.


Scanner 

다양한 타입의 데이터를 "그때 그때" 읽어 오는 객체

-Space,Enter를 모두 경계로 인식 -> 입력받은 데이터 가공하기 쉽다.

-원하는 타입으로 입력 데이터를 반환해주는 next*()메서드를 사용해서 입력 데이터를 읽어와 사용


BufferedReader

데이터를 "한번에" 읽어들여 버퍼라는 공간에 담아 놓고 사용하는 객체

-Enter만 경계로 인식하여 받은 데이터를 String으로 고정 -> 문자 외의 입력 타입은 형변환이 필요

-readLine()메소드로 입력받은 문자를 받아올 수 있다.

-예외처리 필요 ( IOException )

-여러 데이터의 값을 한줄씩 읽어와야 할 경우 StringTokenizer 객체 필요


따라서 속도 측면에서도 BufferedReader > Scanner로 훨씬 빠르다고 할 수 있다.

하지만 BufferedReader는 위와 같이 사용하기가 비교적 까다롭기 때문에 상황에 맞게 잘 사용해야 한다.


결론적으로 읽어올 입력값이 많은 경우 BufferedReader를 사용하여 빠르게 읽어올 수 있다.


StringTokenizer의 메소드

 반환타입

 메소드명

 설명

 String

 nextToken()

 토큰을 하나씩 꺼내온다.

 boolean

 hasmoreTokens()

 남아 있는 토큰이 있는지 여부

 int

 CountTokens()

 꺼내지 않고 남아있는 토큰의 수



BufferedReader와 StringTokenizer 이용하여 입력값 가져오기

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.StringTokenizer;


public class BufferedReader_exam {


public static void main(String[] args) throws IOException {

//입력데이터의 전체를 읽어들일 버퍼 객체 생성하고 전체를 읽어온다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));     

String input = br.readLine();   //전체 입력값의 한줄씩 읽어온다.

System.out.println("br.readLine(): "+ input);

StringTokenizer st = new StringTokenizer(input); //입력값의 한줄을 가지고 StringTokenizer객체 생성

int w = Integer.parseInt(st.nextToken()); //input을 통해 입력받은 값을 공백단위로 구분하여 호출

System.out.println("st.nextToken(): " + w);

int h = Integer.parseInt(st.nextToken());

System.out.println("st.nextToken(): " + h);


}


}


입력값

1 1

0

2 2


실행결과

br.readLine(): 1 1

st.nextToken(): 1

st.nextToken(): 1


'이것저것 알게된 것' 카테고리의 다른 글

2차원배열 특정값으로 채우기  (0) 2019.08.02
char형 연산  (0) 2019.07.20
비트연산자  (0) 2019.07.20
필드와 변수의 차이,선언위치,초기화  (0) 2019.07.16
향상된 for문  (0) 2019.06.07