Post

[멋쟁이사자처럼 백엔드 스쿨] 은행 시스템 개선: Scanner 를 BufferedReader 로 변환

[멋쟁이사자처럼 백엔드 스쿨] 은행 시스템 개선: Scanner 를 BufferedReader 로 변환

학습을 목표로 자바 프로젝트를 진행하고 있습니다.

ScannerBufferedReader에 대해 아래와 같은 차이점을 알게 되었습니다.

특징ScannerBufferedReader
속도느림 (정규식 처리가 추가됨)빠름 (단순 읽기 중심)
메모리 효율상대적으로 무거움더 가볍고 효율적
사용 용도간단한 입력 처리에 적합대량 데이터나 고성능 입력 처리에 적합
유연성정규식 기반 파싱 지원직접 파싱 필요 (더 유연함)

비교

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import java.io.*;
import java.util.Scanner;

public class InputSpeedComparison {

  public static void main(String[] args) throws IOException {
    // 입력 데이터를 생성
    StringBuilder mockInput = new StringBuilder();
    for (int i = 1; i <= 100000; i++) {
      mockInput.append(i).append("\n");
    }
    String inputData = mockInput.toString();

    // Scanner 방식
    long scannerStartTime = System.currentTimeMillis();
    Scanner scanner = new Scanner(new StringReader(inputData));
    while (scanner.hasNextLine()) {
      int num = Integer.parseInt(scanner.nextLine());
    }
    scanner.close();
    long scannerEndTime = System.currentTimeMillis();

    // BufferedReader 방식
    long bufferedReaderStartTime = System.currentTimeMillis();
    BufferedReader bufferedReader = new BufferedReader(new StringReader(inputData));
    String line;
    while ((line = bufferedReader.readLine()) != null) {
      int num = Integer.parseInt(line);
    }
    bufferedReader.close();
    long bufferedReaderEndTime = System.currentTimeMillis();

    // 결과 출력
    System.out.println("Scanner 방식 처리 시간: " + (scannerEndTime - scannerStartTime) + "ms");
    System.out.println(
      "BufferedReader 방식 처리 시간: " + (bufferedReaderEndTime - bufferedReaderStartTime) + "ms");
  }
}

결과

1
2
Scanner 방식 처리 시간: 45ms
BufferedReader 방식 처리 시간: 30ms

결론

간단한 작업엔 Scanner, 성능과 유연성을 원하면 BufferedReader

현재 lion bank 는 반복적인 입력 상황이 많기때문에 변경하기로 결정

변경 사항

입력 방식

  • 기존
1
      Scanner scanner = new Scanner(System.in);
  • 현재
1
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

자세한 변경 사항은 이 곳을 참고해주세요.

This post is licensed under CC BY 4.0 by the author.