본문 바로가기
Java

[Java] BufferReader로 입력받기

by doongjun 2021. 11. 30.

그동안 백준 알고리즘 문제를 풀 때 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

댓글