JAVA에서 기본적으로 입출력에 사용하는 Scanner는 사용이 편리하고 다양한 타입을 다룰 수 있지만, 속도가 느린 단점이 있다. 따라서, 구현한 프로그램의 시간 복잡도를 줄이기 위해서는 입출력에 Scanner 대신 BufferedReader와 BufferedWriter를 사용하는 것이 좋다.
사용 | 속도 | |
Scanner | - 사용이 편리 - 공백과 개행 문자를 경계로 입력 값을 인식 - 입력받을 수 있는 데이터 타입이 다양 |
느림 |
BufferedReader | - 사용이 번거로움 - 개행 문자만을 경계로 입력 값을 인식 - 데이터 타입은 String으로 고정 => 필요한 데이터를 처리하기 위해서는 추가적인 가공 필요 - 예외처리 필요 (try&catch 혹은 throw 이용) |
빠름 (입력된 데이터가 바로 전달되지 않고, 버퍼를 거쳐 전달되므로 데이터처리의 효율성이 높아짐) => 많은 양의 데이터를 처리할 때 효율적 |
BufferedWriter도 마찬가지로 버퍼를 거쳐 출력장치로 전달하므로 많은 양의 데이터를 출력할 때 효율적이다.
BufferedReader와 BufferedWriter를 사용하려면 다음과 같이 추가적인 import가 필요하다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
BufferedReader의 경우 다음과 같이 사용한다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
1. readLine() 메소드를 사용한다. 기본 데이터 타입은 String 이기에 위 예시처럼 int형으로 사용하고 싶다면, Integer.parseInt로 형 변환이 필요하다.
2. 따라서 예외 처리가 필요하다.
i) throw 이용 : import java.io.IOException; || public static void main(String[] args) throws IOException {
ii) try & catch 이용
한 줄에 둘 이상의 입력을 받을때는, .split()이나 StringTokenizer를 사용한다.
i) .split() 사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
int N = Integer.parseInt(str[0]);
int M = Integer.parseInt(str[1]);
ii) StringTokenizer 사용
StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(stk.nextToken());
int M = Integer.parseInt(stk.nextToken());
BufferedWriter의 경우 다음과 같이 사용한다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
for (int a = 0; a < n; a++)
bw.write(result[a] + " ");
bw.flush();
1. write() 메소드를 사용하여 출력 값들을 버퍼에 저장해 두고, flush() 메소드를 사용하여 출력한다.
2. write() 메소드는 개행을 자동으로 지원하지 않는다.
따라서 개행이 필요한 경우, bw.write("\n"); 를 함께 써주어야 한다.
'PL 문법 > JAVA' 카테고리의 다른 글
[JAVA] Array와 List 차이점 / 컬렉션 프레임워크 ArrayList<E>, LinkedList<E> (0) | 2021.06.28 |
---|