Notice
«   2025/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

22gamin

[Java] Scanner vs BufferedReader 본문

알고리즘

[Java] Scanner vs BufferedReader

22gamin 2024. 9. 10. 10:36

 

Java로 알고리즘 문제를 푸는 도중 Scanner 클래스를 사용했을 때 시간 초과가 날 경우 BufferedReader을 사용하여 해결할 수 있다.

 

 

 

Scanner 사용법

import java.util.Scanner;

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

        String input = sc.nextLine();
    }
}

 

 

BufferedReader 사용법

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();
    }
}

 

  • readLine()은 IOException 예외를 발생시킬 수 있기 때문에 반드시 예외처리를 해주어야한다.
  • readLine은 반환값을 String으로 넘기기 때문에, 다른 타입을 사용하고 싶을 때, 형변환을 해주어야한다.

 

  • readLine()을 사용하면 라인 단위로 값을 받아오기 때문에, split이나 StringTokenizer등을 이용, 파싱해서 사용해야함
/* split을 이용한 Parsing */
String[] stringArray = s.split(" "); //띄어쓰기를 구분자로 파싱한다.

/* StringTokenizer을 이용한 Parsing */
StringTokenizer st = new StringTokenizer(s, " ");

 	int i = Integer.parseInt(st.nextToken());
 	int j = Integer.parseInt(st.nextToken());
}

 

 

 

BufferReader와 Scanner의 속도 차이

 

~

출처: 백준 블로그

 

 

  • 위의 사진을 보면 알 수 있듯이 BufferedReader 사용시에 0.6585, Scanner 사용시에 4.8448초가 걸리는 차이를 볼 수 있음. 
  • 적은 양의 데이터인 경우 문제가 없겠지만, 데이터 양이 많아질수록 성능 차이가 큼

 

 

BufferReader와 Scanner의 속도 차이가 나는 이유

→ buffer 사용 여부의 차이

 

  • Scanner는 1KB 크기의 버퍼를 갖기 때문에 입력이 바로 전달되는 반면 BufferedReader는 8KB 크기의 버퍼를 가져 buffer에 입력들을 저장하였다 한 번에 전송하기 때문에 속도가 더 빠름!
  • 또한 Scanner는 입력을 읽는 과정에서 내부에서 정규 펴현식 적용, 입력값 분할, 파싱 과정 등을 거치기 때문에 속도가 느림!

 

 

 

 

  • System.in은 java.lang 패키지의 System 클래스이며, System 클래스의 in은 정적 변수이다.
public final class System {
    public static final InputStream in = null;
    
    ...
}

 

  • in은 inputStream 타입의 변수이다.
  • inputStream은 java.io 패키지의 바이트 단위 입력을 위한 최상위 입력 스트림 클래스이다.
  • System.in을 매개변수로 사용하기 때문에 사용자(키보드) 입력을 받을 수 있다.

 

 

  • System.in과 BufferedReader 클래스를 사용할 때는 main 옆에 throws IOException이 붙음
  • 사용자의 입력은 여러 다양한 타입으로 들어올 수 있는데, 잘못된 값이 들어올 경우 에러가 나지 않도록 예외 처리를 해줘야함

'알고리즘' 카테고리의 다른 글

deque의 이해 및 사용법  (0) 2024.05.09
음료수 얼려 먹기/미로 탈출 [DFS/BFS]  (0) 2024.01.31
탐색 알고리즘 DFS/BFS  (0) 2024.01.31