Scanner와 BufferedReader

정혜연·2023년 10월 25일
post-thumbnail

입출력 관련 코딩테스트 문제들을 풀어보다 한가지 사실을 깨달았다.
입출력에도 성능 차이가 있다는 것. (당연하겠지)

Java를 공부하면서 늘 Scanner를 사용했었는데, 이번에는 BufferedReader, BufferedWriter에 대해서 알아보고자 한다.

이름을 보면 알겠지만, 이 둘은 버퍼(Buffer)를 이용해 읽고(Read) 쓰는(Write) 함수이다.

버퍼(Buffer)가 뭔데?

버퍼(Buffer)는 데이터를 전송할 때 일시적으로 그 데이터를 보관하는 임시 메모리 영역이다.

버퍼를 사용하지 않은 쌩 입출력은 성능이 낮다.
예를 들어 통나무를 쪼개서 땔감을 모을 때... 통나무 하나 쪼개고 나온 땔감을 갖다 두고, 또 돌아와서 통나무 하나 쪼개고 나온 땔감을 갖다 두기보다는, 나온 땔감들을 수레에 모아두었다가 한번에 가져다 두는 쪽이 훨씬 효율적이지 않은가?

그런 의미에서 Scanner는 버퍼를 사용하지 않은 단순 입출력 메서드이고, BufferReader/Writer는 버퍼를 사용하여 성능을 높인 입출력 메서드인 것이다.

그러면 Scanner는 나쁜 거야? 라고 생각할 지도 모르겠지만, Scanner의 경우에는 스페이스와 엔터를 경계로 입력 값을 인식하기에 따로 가공할 필요가 없어 간편하다는 장점이 있다. 게다가, 원하는 자료형을 원하는대로 모두 받을 수 있다.

Scanner sc = new Scanner(System.in);

int A = sc.nextInt();
String st = sc.next();
String st2 = sc.nextLine();

BufferedReader는 엔터만 경계로 입력 값을 인식하며, 받을 수 있는 자료형이 String으로 고정되어 있기에 다른 자료형을 원할 경우 따로 형변환 해주어야 한다.
그리고 입력받은(읽은) 데이터를 출력하기(쓰기)위해서 BufferedWriter를 이용해야 한다.
또한 따로 개행 처리를 해주어야 한다.

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

...

int A = Integer.parseInt(bf.readLine());
String B = bf.readLine();

bw.write(String.valueOf(A)+"\n");
bw.write(B);


위쪽이 BufferedReader를, 아래쪽이 Scanner를 사용해서 풀어본 문제. 속도 차이가 상당하다.

간단한 입출력이라면 크게 느껴지지 않을지 모르지만, 많은 데이터를 입력받아야 하는 상황에서는 유의미한 차이가 있으므로 BufferedReader를 사용하는 쪽이 유리하겠다!!

profile
자바 공부중

0개의 댓글