자바(JAVA) - Scanner & BufferedReader

곽지욱·2023년 9월 16일
1

Java

목록 보기
1/4

자바를 처음 배울 때 사용자(키보드) 입력받기 위해 보통 Scanner를 많이 사용한다.

알고리즘 문제를 풀다보니, Scanner를 사용하여 입력을 받을 경우에 시간이 초과되거나 하는 경험을 하였다. 그래서 다른 방법을 찾다보니 BufferedReader 에 대해서 알게되었고 둘의 차이점을 알아보았다.

Scanner와 BufferedReader 클래스 모두 사용자 입력을 받을 수 있는 기능을 제공하지만 속도에서 큰 차이점이 있음

import java.util.Scanner;

public class Input {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String input = sc.nextLine();
    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Input {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String input = br.readLine();
    }
}

적은 양의 데이터를 다룰 때에는 별 차이가 없지만 데이터 양이 많아 질 수록 성능 차이가 커지게 된다

평균적으로 BufferedReader 는 사용시에 0.6585, Scanner 사용시에 4.8448 초가 걸림

그렇다면 둘의 속도 차이가 나는 이유는 무엇일까?

이유는 이름에서도 클래스의 이름에서도 유추할 수 있었다. Buffer 사용 여부의 차이이다

Scanner는 1KB 크기의 버퍼를 갖고, 입력이 바로 전달되는 반면 BufferedReader는 8KB 크기의 버퍼를 가지기 때문에 Buffer에 입력들을 저장하였다 한 번에 전송한다

예를들면 물건을 배송할 때 하나 씩 옮기는 사람과 한꺼번에 옮기는 사람의 효율성 차이인 것이다.

적은 양의 물건을 옮길 때에는 큰 차이가 없겠지만 물건(데이터)의 양이 많아질 수록 한번에 옮기는 사람의 효율성이 극대화 되는 것

!!그렇다면 출력 부분에서도 차이가 있을 까??

출력도 마찬가지로 buffer를 통해서 프로그램에 전달이 되기 때문에 시스템의 데이터 처리 효율성을 높여줄 수 밖에 없음.

!!System.in과 BufferedReader 클래스를 사용할 때는 main 옆에 throws IOException 이 붙게되는데 그 이유는?

사용자의 입력을 여러 다양한 타입으로 들어올 수 있음 , 잘못된 값이 들어올 경우 에러가 나지 않도록 '예외처리'가 필요한데,

Scanner에서는 System.in을 생성할 때 내부에서 try-catch를 사용하여 예외 처리를 하기 때문에 예외처리를 하지 않아도 되지만

BufferedReader의 경우 예외처리를 위해 라고 생각하면 됨.

0개의 댓글

관련 채용 정보