Java로 처음 알고리즘을 풀 때는 Scanner를 이용하다가 BufferedReader를 알게되고 효율성에 대해 생각했다. 입출력으로 생각보다 시간이 단축되는 것을 보고 정리를 하기로 했다.
Input, Output과 관련된 Java Class Convention
Scannner sc = new Scanner(System.in);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Hello World")
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
bufferedWriter.write("Hello World!");
bufferedWriter.flush();
bufferedWriter.newLine();
bufferedWriter.close();
String을 String c = a + b;
처럼 사용하면 String은 불변하기 때문에 새로운 메모리 영역을 가리키게되고 a 와 b는 메모리에 garbage로 남아있게된다.
이를 해결하기 위해서 StringBuffer 과 StringBuilder가 나왔다.
두 메서드의 코드는 비슷하지만 StringBuffer는 멀티 쓰레드 환경에서 안전하다. StringBuilder는 동기화를 지원하지 않기 때문에 단일 쓰레드 환경에서 적합하다.
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Hello\n");
stringBuilder.append("World!\n");
bufferedWriter.write(stringBuilder.toString());
bufferedWriter.flush();
bufferedWriter.close();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abc\n");
stringBuffer.append("123\n");
bufferedWriter.write(stringBuffer.toString());
bufferedWriter.flush();
bufferedWriter.close();
StringTokenizer는 문자열을 분리할 때 사용한다.
기본 사용법은 다음과 같다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
st.nextToken()
기본적으로 Token은 공백을 기준으로 분리되고, 따로 delim을 설정하여 구분자를 지정할 수 있다. 또한 구분자를 Token으로 반영할 것인지도 정할 수 있다.
Java로 알고리즘을 풀면서 input과 output 방법을 언젠간 정리하고 싶었는데 이렇게 하게되어서 후련하고, 과정을 알게되어서 더 적극적으로 도입할 수 있을 것 같다.
Reference:
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html
https://st-lab.tistory.com/41
https://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html
https://ryulth.com/devnote/2019/06/17/java-io-tips/