그동안 백준 알고리즘 문제를 풀 때 Scanner를 사용하며 문제가 없었지만
메모리 문제나 실행 속도 문제를 신경쓰기 시작하면서 알게된 BufferReader에 대해 복습해보려고 한다.
Scanner는 사용하기 간단하고 다양한 자료형으로 입력받을 수 있다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
float actualNum = scan.nextFloat();
String str = scan.next();
String line = scan.nextLine();
}
}
위의 예시 이외에도 nextLong(), nextDouble() 등의 내장함수를 사용할 수 있다.
하지만 Scanner는 버퍼길이가 1024 chars로 한정적이기 때문에
한번에 많은 입력값을 저장하는데에 많은 시간이 소요돼 비효율적이다.
반면 BufferedReader는 버퍼길이가 8192 chars로 많은 데이터를 한번에 받아오고자 할 때 성능 상 효율적이다.
왜냐하면 BufferedReader Class가 기본 입출력 스트림에 버퍼 기능을 추가한 Stream(Buffer Stream)을 이용해
입력받기 때문이다. 이는 입력된 데이터가 바로 프로그램으로 전달되지않고 중간에 버퍼링이 된 후 전달되며,
시스템의 데이터처리의 효율성을 높여준다. 다만 Scanner보다 비교적 사용 방식이 복잡하고 Enter 기준으로 입력받기 때문에,
공백 기준으로 값을 입력받는 경우 별도 파싱이 필요하다(StringTokenizer : String.split()과 유사, 공백 기준으로 파싱).
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
System.out.println("line : " + line);
StringTokenizer st = new StringTokenizer(line);
String first = st.nextToken();
String second = st.nextToken();
System.out.println("first : " + first);
System.out.println("second : " + second);
}
}
실행결과
'Java' 카테고리의 다른 글
[Java] 추상클래스와 인터페이스 (0) | 2021.11.30 |
---|---|
[Java] HashMap을 Value 기준으로 정렬하는 방법 (1) | 2021.11.12 |
[Java] JRE와 JDK (0) | 2021.07.20 |
[Java] HashMap 함수 사용하기 (0) | 2021.06.16 |
댓글