본문 바로가기
Language/Java

[JAVA] Scanner 와 BufferedReader 차이 & 사용법

by jungwon3004 2022. 1. 14.
728x90
반응형

1. 사용법

(1) Scanner

import java.util.Scanner

public class Main{
	public static void main(String[] args){
    	Scanner in = new Scanner(System.in);
		int i = in.nextInt();
        String s = in.next();
        String sl = in.nextLine();
        double d = in.nextDouble();
        boolean b = in.nextBoolean();
	}
}

 (2) BufferedReader

import java.io.BufferedReader;
import java.InputStreamReader;
import java.io.IOException;

public class Main(){
	public static void main(String[] args) throws NumberFormatException, IOException{
    	BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        
        String s = bf.readLine();
        int i = Integer.parseInt(bf.readLine());
	}
}

 

728x90

2. 차이점

(1) data type

Scanner는 int, String, floeat, boolean, double 등 다양한 data type을 지정할 수 있다.

BufferedReader는 line 단위의 String 만 가능하다.

 

Scanner는 파싱을 제공하기 때문에 우리가 따로 해줄 필요가 없다.

하지만 BufferedReader에서는 파싱을 제공하지 않기 때문에 우리가 따로 해줘야 하는 것

심지어 line 단위로 인식하기 때문에 " " 단위로 쪼개는 것도, data type을 바꾸는 것도 전부 직접 코드로 짜서 파싱해줘야 한다.

 

 

위 사용법 설명에서 보면

int i = Integer.parseInt(bf.readLine());

을 통해 int 값을 만들었다.

이건 bf.readLine()이 String이기 때문에 String 을 int로 바꾸는 과정을 거친 것이다.

 

그렇다보니 입력받은 String 값이 int로 바꿀 수 없는 경우도 있을 것이다.

이런 경우를 위해, throws로 예외처리를 할 수도 있고, try{ ... } catch(...){...} 예외처리를 할 수도 있다.

어쨌든, 예외처리는 해야한다.

 

참고로 당연히 Scanner도 예외처리를 했다.

다만 우리가 직접할 필요없이 class 안에서 이미 해둔 것

 

반응형

(2) 속도

사실 Scanner가 딱 봐도 더 편하다.

그럼에도 불구하고 BufferedReader 를 쓰는 가장 큰 이유는 이거다.

바로 속도!!!

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

이 긴 길이에, String 밖에 안 된다는 단점에도 불구하고 쓰는 이유는 속도이다.

Scanner보다 훨씬 빠르다.

속도를 좀 더 디테일하게 보면

java.util.Scanner => 6.068초

java.io.BufferedReader(*) => 0.934초

환경에 따라 차이는 있겠지만, 이만큼 속도 차이가 심하다는 걸 알 수 있다.

 

Scanner는 내부에서 파싱을 진행하기 때문에 차이가 발생한다.

 

 

(3) 동기화

여러 thread들 사이에서 Scanner instance는 공유할 수 없다.

하지만 BufferedReader instance는 공유할 수 있다.

 

Scanner : 동기화x

BufferedReadr : 동기화o

 

728x90
반응형