📌 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]



참고자료



Leave a comment