티스토리 뷰

이때까지 귀찮아서 Scanner만 항상 사용했는데, 이제야 정리를 해보고, 오늘 부로 절대 Scanner를 사용하는 과거로 돌아가지 않을 것이다.

 

1. Scanner

Scanner는 띄어쓰기와 개행문자를 경계로 값을 인식하기 때문에 따로 가공할 필요가 없어 편리하다.

하지만 BufferedReader는 입력 받은 데이터가 String으로 고정되기 때문에 데이터를 원하는 타입으로 가공하는 작업이 필요하다.

알다시피  Scanner는 지원하는 메서드가 많다. 하지만 버퍼 사이즈가 1024 char이기 때문에 많은 입력을 필요로 할 경우에는 성능 상 좋지 못한 결과를 야기한다. (Scanner도 buffer 사용한다)

 

2. BufferedReader

BufferedReader는 개행문자만 경계로 인식하고 입력받은 데이터가 String으로 고정된다.

그렇기에 데이터를 따로 가공해야 하는 경우가 많지만, Scanner 보다 속도가 빠르다.

버퍼 사이즈가 Scanner는 1024 char인데 비해, BufferedReader는 8192 char 이기 때문에 입력 받을 값이 많으면 BufferedReader가 유리하다.

 

또한 BufferedReader는 동기화 되기 때문에 멀티 쓰레드 환경에서 안전하고,  Scanner는 동기화 되지 않기에 멀티 쓰레드환경에서 안전하지 못하다.

사용법은 다음과 같다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
String str = br.readLine();
int num = Integer.parseInt(br.readLine());

데이터 가공은 StringTokenizer나 split() 함수를 통해서 사용한다.

// StringTokenizer 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());

// String.split() 함수
String arr[] = s.split(" ");

코테에서 사용하는 메서드는 readLine()close() 밖에 없다.

또한 IOException 체크 예외 처리를 반드시 해줘야 한다.

더 이상 사용할 필요가 없다 → close() 통해서 자원 해제 해주기.

 

 

3. BufferedReader가 Scanner 보다 성능이 좋은 이유

출처 : https://jhnyang.tistory.com/entry/Java-자바-입출력-BufferedReaderBufferedWriter

버퍼를 사용하지 않는 입력은 키보드 입력이 키를 누르는 즉시 바로 프로그램에 전달된다.

반면, 버퍼를 사용하는 입력은 키보드의 입력이 있을 때 마다 한 문자씩 버퍼로 전송된다.

버퍼가 가득 차거나 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.

 

* 버퍼(buffer) :

  • 데이터를 한 곳에더 다른 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 임시 메모리 영역.
  • 입출력 속도 향상을 위해 버퍼를 사용한다.

외부장치(키보드, 모니터)와 데이터 입출력이 생각보다 시간이 오래 걸리는데, 키보드 입력이 있을 때마다 바로 이동시키는 것보다 중간에 버퍼를 두어 한번에 묶어 보내는 방식이 더 효율적이고 빠른 방법이다.

 

4. System.out.println()보다 BufferedWriter를 사용하자.

많은 양의 출력을 할 때는, 입력과 동일하게 버퍼를 사용하는 것이 좋다.

 

BufferedWriter 사용방법

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "abcdef"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();

단점은 BufferedWriter에서는 출력과 개행을 println 처럼 한번에 해주지 않기 때문에 개행을 위해서는 newLine() 메서드 혹은 bw.write("\n")을 사용해야 한다.

또한 BufferedWriter는 버퍼를 잡아 놓았기 때문에 반드시 사용 한 후, flush() 또는 close()를 해 주어야 한다.

close()를 하게 되면 출력 스트림을 아예 닫기 때문에 다른 것도 출력하고자 한다면 flush()를 사용하면 된다.

 

 

[Reference]

 
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday