백준 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 |