티스토리 뷰

입출력이 많이 일어날때 수행시간 개선을 위한 방법들이다. 

 

BufferedReader, BufferedWriter은  java의 Scanner와 System.out.print() 보다 빠른 입출력이 필요할때 쓴다.

PS 문제에서 입출력이 많이 일어날때 c++은 

ios::sync_with_stdio(false); cin.tie(NULL) 이런 식으로 스트림을 통합해준다면 

자바에서는 스캐너와 프린트 함수 대신 이걸 쓰면 된다.

 

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

버퍼를 사용하는 입력은 키보드의 입력이 있을때마다 버퍼로 전송되고, 버퍼가 가득 차거나 개행 문자가 나타나면 버퍼의 내용을 한번에 프로그램에 전송한다.

하드디스크는 속도가 느리고, IO 외부장치 (키보드,모니터등)과의 데이터 입출력도 시간이 오래걸리기 때문에 버퍼를 거쳐서 한번에 보내는게 빠르다.

 

BufferedReader

BufferedReader로 입력 받으면 무조건 String으로 리턴된다.

따라서 다른 형으로 이용한다면 형변환이 필요하다.

개행 만 경계로 인식한다.

 

BufferedWriter

마찬가지로 String을 출력하므로 다른 형이라면 String으로 형변환후 출력해야 한다.

write() 함수로 버퍼에 쓰고. 

flush() 함수로 버퍼에 있는 모든 문자를 출력한다.

close() 함수로 닫아준다.

 

import java.io.*;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Temp1 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // String 입력
        String str = br.readLine();
        bw.write(str);
        bw.newLine();

        // int 입력
        int n = Integer.parseInt(br.readLine());
        bw.write(String.valueOf(n));
        bw.newLine();

        // flush로 출력
        bw.flush();
        bw.close();
    }
}

 


StringBuilder

출력이 많이 일어난다면 출력을 매번 하지않고,

문자열 형태로 이어붙여서, 마지막에 한번만 flush하는 형태로 수행시간을 개선할수도 있다.

이때 자바에서는 StringBuilder를 사용해 쉽게 문자열을 이어붙일수 있다. 

StringBuilder 클래스는 charAt(), indexOf() 등 String 클래스의 대부분 함수들을 사용할수 있다.

 

String 클래스를 사용하지 않고 StringBuilder 클래스를 사용하는 이유는 JAVA의 String은 immutable(불변) 속성을 갖기 때문이다. 

다음과 같이 String 클래스로 문자열을 이어붙이면

"abc"에 'c'를 붙여서 "abcc"가 되었다. 

하지만 이때는 정확히 말하면 "abc"에 'c'가 이어 붙여진게 아니라 "abcc"라는 새로운 String 객체를 만들어서 리턴해준 것이다.

이렇게 이어붙일때마다 새로운 객체를 만들어서 참조해야하기 때문에 속도가 느리다.

 

StringBuilder 클래스는 기존의 문자열에 이어붙이는 형태이므로

문자열을 이어주는 연산이 많다면 속도 측면에서 더 빠르다.

 

 

StringBuffer

StringBuffer 는 기본적으로 StringBuilder 와 기능은 같은데,

동기화를 지원하기때문에 스레드 환경에서 사용한다.

속도는 StringBuilder 보다 느리지만 병렬 상황에서 안전하다.

'노트' 카테고리의 다른 글

C# 자주쓰는 함수 정리  (0) 2021.12.31
kotlin 자주쓰는 함수 정리  (0) 2021.12.31
c++) priority_queue cmp 구조체 정의  (0) 2021.12.27
c++) cin.ignore()  (0) 2021.12.26
언어별 2차원 배열 입력  (0) 2021.12.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함