본문 바로가기

생각정리/Java

[JAVA] Scanner 와 BufferedReader 차이

Scanner와 BufferedReader 차이


프로그래머스에서 문제를 풀면 입력을 받고 출력을 하는 데 있어 따로 신경을 안 써도 되지만 백준에서 문제를 풀면서 직접 데이터를 입력받고 출력을 하는 데 있어 성능에 차이가 있고 이 차이로 인해서 문제를 틀릴 수 도 있어 중요하게 생각을 안 할 수가 없게 되어 사용하는 입력 클래스를 비교해 보기로 했다.

Scanner

하나의 입력값이 입력되면 즉시 바로 전달을 한다.

대신 입력 받을 때 원하는 형태의 자료값으로 정해 입력값을 받을 수 있어 직관적이고 사용값을 고정할 수 있다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        String a = scanner.nextLine(); // 한줄에 있는 입력값
        int b = scanner.nextInt(); // int형 입력값
        float c = scanner.nextFloat(); // float형 입력값
        String d = scanner.next(); // 문자형 입력값

    }
}

nextLien()으로 입력을 받을 때는 앞에 입력이 있으면 주의 있게 사용해야 한다.

엔터를 이용해서 입력을 넘어 올 경우 엔터를 입력값으로 출력을 할 수 도 있다.

BufferedReader

입력값을 버퍼에 담아두었다가 한번에 프로그램에 전송한다.

입력값은 String형태로 들어와 사용할 때 필요한 형태로 변형을 시켜서 사용을 해야 한다.

입력값을 가져오기 위해서 IOException으로 에러처리를 해야 한다.

public class Main {
    public static void main(String[] args) throws IOException {
    
    	BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        
        String a = bufferedReader.readLine(); // 한줄의 입력값 
        int b = Integer.parseInt(bufferedReader.readLine()); // 입력값 int형으로 변환
        
        // 일정한 형태로 한줄에 입력값이 주어질 경우 ex) 1 2 3
        // split 활용
        String[] array = bufferedReader.readLine().split(" ");
        int c = Integer.parseInt(array[0]);
        int d = Integer.parseInt(array[1]);
        int e = Integer.parseInt(array[2]);
        
    	// StringTokenizer 활용 
        // 기본구분자는 띄어쓰기로 구분한다. new StringTokenizer(문자열, 구분자);
        StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());
        int f = Integer.parseInt(stringTokenizer.nextToken());
        int g = Integer.parseInt(stringTokenizer.nextToken());
        int h = Integer.parseInt(stringTokenizer.nextToken());
    }
}
프로그램을 작동을 할 때는 한 번씩 작동을 하는 부분보다 한 번에 여러 개를 하는 방법이 대게 빠른 경우가 많다.
입력속도가 적더라도 BufferedReader가 보통 빠르기 때문에 Scanner는 안 쓰는 편이다. Scanner가 직관적이고 입력값을 정해서 받을 수 있지만, 그 부분은 입력값을 사용할 때 잘 구분만해서 사용하면 BufferedReader도 다 커버가 가능하다.
이와 같은 개념으로 여러 입력같이 주어질 때, split를 사용하기보다 StringTokenizer를 이용해서 활용한다.
물론 split을 이용할 때가 유리할 때가 있어 사용을 가끔 하지만 보통은 StringTokenizer로 가능하다.

'생각정리 > Java' 카테고리의 다른 글

자바 버전 선택에 대한 이유  (0) 2024.05.27
[JAVA] 문자열 사용  (0) 2023.11.28
[JAVA] 스레드  (0) 2023.08.17
[JAVA] 업캐스팅, 다운캐스팅  (0) 2023.08.17
[JAVA] Wrapper 클래스  (0) 2023.08.16