[코딩테스트] Java 입력 방식 : Scanner VS BufferedReader

최지나·2024년 4월 4일
3

코딩테스트

목록 보기
139/154
  • 백준 2470번 문제를 푸는 도중에 계속해서 "시간 초과" 가 발생했다. 투포인터 알고리즘으로 풀었고, 종료 조건도 제대로 설정해 두었는데 대체 어떻게 시간을 더 줄일 수 있지,,,? 를 고민하다가 input 방식을 Scanner에서 BufferedReader로 바꾸어 보았더니 성공했다,,! 그래서 이번 기회에 두 입력 방식의 차이를 기록해보고자 한다. ✒️✒️


Scanner

입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스

  • 사용이 간편하고 다양한 형태의 입력(문자열, 정수, 실수) 등을 쉽게 처리 가능. 하지만, 대량의 데이터 처리에는 속도가 다소 느린 편

예시

  • 문자열 입력
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
System.out.println("입력받은 문자열: " + line);
  • 정수 배열, 실수 입력
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); 
dobule m = scanner.nextDouble;
int[] numbers = new int[n];
for (int i = 0; i < n; i++) {
    numbers[i] = scanner.nextInt();
}
System.out.println(Arrays.toString(numbers));
System.out.println(m);

BufferedReader

데이터를 한번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스

  • 버퍼를 사용하여 입력을 받기 때문에 대량의 데이터 빠르게 처리.
  • 단, 문자열 입력만 직접적으로 지원하기 때문에 숫자와 같은 다른 타입의 입력을 처리하기 위해서는 추가적인 파싱 작업이 필요

예시

  • 문자열 입력
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
System.out.println("입력받은 문자열: " + line);
  • 정수 배열, 실수 입력
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine()); 
double m = Double.parseDouble(reader.readLine());
int[] numbers = Arrays.stream(reader.readLine().split(" ")).mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(numbers));
System.out.println("입력받은 실수: " + m);

정리

기능ScannerBufferedReader
속도상대적으로 느림상대적으로 빠름
대량의 데이터 처리비효율적효율적
사용의 용이성사용하기 쉬움사용하기 어려움 (추가 파싱 필요)
버퍼 사용내부적으로 사용하지만 사용자가 제어 불가명시적으로 버퍼 사용, 크기 조절 가능
입력 타입 다양성다양한 입력 타입을 메서드로 직접 지원주로 문자열 입력 후, 타입 변환을 통해 다른 타입으로 처리
정규 표현식 지원지원 (delimiter 설정 가능)지원하지 않음
라인 단위 처리라인 단위 입력 처리가 번거로움 (nextInt 후 nextLine 사용 시 주의 필요)라인 단위 입력에 최적화
  • 간단한 입력 처리나 코드의 가독성이 좋은 경우에는 Scanner를 사용하는 것이 좋고, 대량의 데이터 처리 속도가 중요한 어플리케이션에서는 BufferedReader를 사용하는 것이 더 효율적이다.
  • 그동안 입력을 받을 때는 주로 Scanner만 사용했었는데, 상황에 따라서 BufferedReader를 통한 입력도 고려해봐야겠다!!

참조

profile
의견 나누는 것을 좋아합니다 ლ(・ヮ・ლ)

0개의 댓글