입출력 - BufferedReader, BufferedWriter, StringBuilder
📌 Buffer 사용 vs. 미사용
- 버퍼(Buffer) : 데이터를 한 곳에서 다른 곳으로 전송하는 동안 일시적으로 데이터를 저장하는 임시 메모리 영역
미사용 키를 누르는 즉시 입력을 프로그램에 전달 ex. Scanner 사용 입력이 있을 때 한 문자씩 버퍼를 전송 후 버퍼가 가득 차거나 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달 -> 하드디스크의 속도가 느려서 데이터의 입출력도 시간이 소요됨. 따라서 중간에 버퍼를 두어 한 번에 묶어 보내는 것이 더 효율적이고 빠름
1. BufferedReader
Scanner vs. BufferedReader
Scanner | BufferedReader |
---|---|
• 띄어쓰기와 개행문자를 경계로 입력 값을 인식함 -> 따로 가공할 필요 X ex. int 입력 받을 때는 nextInt() 메소드 사용 |
• 개행문자를 경계로 인식 • 입력받은 데이터가 String으로 고정됨 -> 가공 필요 |
• 버퍼 사이즈 : 1024 char -> 많은 입력 필요할 때 성능 좋지 않음 |
• 버퍼 사이즈 : 8192 char |
BufferedReader 사용 방법
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int i = Integer.parseInt(br.readLine());
- 개행문자 단위로 나눔 (
readLine()
) : Scanner의nextLine();
- 공백 단위로 나누려면
StringTokenizer
또는String.split()
이용StringTokenizer
의 경우nextToken()
사용String.split(" ")
은 공백단위로 끊어서 배열에 저장
- 반환값이 String이기 때문에 타입 변환 필요
- 예외처리 반드시 필요 :
try ~ catch
또는throws IOException
2. BufferedWriter
- 많은 양을 출력할 때에는
System.out.println()
보다BufferedWriter
의 성능이 더 좋음
BufferedWriter 사용 방법
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = "hello"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // or bw.write("\n"); : 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
-
출력과 개행을 동시에 해주지 않음
-> 개행하려면
newLine()
또는write(”\n”)
- 버퍼를 잡아 놓았기 때문에 사용 후 반드시
flush()
/close()
flush()
: 버퍼에 남아있는 데이터를 출력하여 버퍼를 비움close()
: 출력 스트림 아예 닫음
- BufferedReader와 같이 예외 처리 필요
3. StringBuilder
String vs. StringBuffer/StringBuilder
String | StringBuffer / StringBuilder |
---|---|
• 불변성 : String이 바뀌면 기존 String에 있던 값을 버리고 새로운 값을 재할당 : 처음 할당된 String의 메모리 영역은 Garbage로 남아있다가 GarbageCollection에 의해 없어짐 -> 문자열 변경이 자주 일어나는 경우 성능에 불리 |
• 가변성 : .append(), .delete() 를 이용해 문자열 변경이 가능 |
StringBuffer vs. StringBuilder
StringBuffer | StringBuilder |
---|---|
• 동기화 지원 -> 멀티 쓰레드 환경에서 안전함 | • 동기화 지원 X -> 멀티 쓰레드 환경에서 사용하기 적합하지 않음 • 단일쓰레드에서는 StringBuffer보다 성능이 뛰어남 |
StringBuilder 사용 방법
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b").append(" ");
sb.append("c").append("\n");
- 주요 메서드
append(String s)
delete(int start, int end)
insert(int offset, any primitive of a char[])
replace(int start , int end , String s)
reverse()
setCharAt(int index , char ch)
: ch로 치환indexOf(String s)
subString(int start, int end)
: python의 [start:end]
참고자료
- [Java] 빠른 입출력을 위한 BufferedReader, BufferedWriter, StringTokenizer, StringBuilder
- [Java] 입출력 BufferedReader / BufferedWriter
- BufferedReader와 BufferedWriter의 사용법 (JAVA)
Leave a comment