ABOUT ME

작은 디테일에 집착하는 개발자

Today
-
Yesterday
-
Total
-
  • [Java] BufferedReader와 BufferedWriter (입출력 속도)
    IT Study/컴퓨터 기초 2023. 3. 15. 10:44
    728x90

     

    백준 알고리즘을 풀며 Scanner와 System.out.println() 사용할 때, 

     

    📌 시간 초과가 나는 이유는 무엇일까요?

    - Java 입력 속도

    6위에 자리매김한 BufferedReader와 Integer.parseInt와 비교하여

    Scanner를 사용할 때에는 약 7배 정도 느려집니다.

     

    - Java 출력 속도

    7위에 위치한 BufferedWriter와 bf.write()와 비교하여

    System.out.println()의 출력 속도는 약 30배 이상 느리다는 것을 확인할 수 있습니다.

     

    버퍼는 데이터를 전송하는 동안 일시적으로 데이터를 보관하는 임시 메모리 영역으로,

    입출력 속도 향상을 위해 사용할 수 있습니다.

    이를 위해 우리는 BufferedReader - BufferedWriter를 사용할 수 있어야 합니다.

     

    📌 BufferedReader : 입력 방법

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 선언
    br.readLine() 한 줄 읽어 String 타입으로 변경
    br.close() 입력 스트림 닫기

     

    1. 선언 : BufferedReader를 사용하기 위해서는 throws IOException를 통해 예외 처리하는 것이 필수입니다. 

    public class Main {
    	public static void main(String[] args) throws IOException { // 예외 처리
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
    	}
    }

     

    2. 입력받기

    2-1. String 문자열 입력받기 :  br.readLine()String 타입의 한 줄을 입력받을 수 있습니다.

    String s = br.readLine();

     

    2-2. int 정수 입력받기 : Integer.parseInt()를 통해 문자열을 정수로 변환할 수 있습니다. 

    int i = Integer.parseInt(br.readLine());

     

    2-3.  입력받은 문자열에 공란(" ") 존재 시, 공란으로 구분하여 데이터 사용하기

    2-3-1. StringTokenizer 사용

    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    
    // StringTokenizer(br.readLine(), " ")		: 입력받은 문자열 br.readLine()을 구분자 공란(" ")으로 분리하여 Token st에 저장
    // StringTokenizer(String str,String delim)	: 주어진 문자열 str을 구분자 delim으로 분리하여 Token st에 저장

     

    2-3-2. String과 split

    String str = br.readLine();
    String arr[] = str.split(" ");
    
    // 입력받은 문자열 str을 공란(" ")으로 분리하여 배열 arr[]에 저장

     

    3. 입력 스트림 닫기 : 더 이상 입력받지 않는다면 입력 스트림을 닫아줍니다.

    br.close();

     

    📌 BufferedWriter : 출력 방법

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 선언
    bw.write() 출력할 내용 담기 (출력 X)
    bw.flush() 출력과 동시에 버퍼 비우기
    bw.close() 출력 스트림 닫기

     

    1. 선언 : BufferedWriter를 사용하기 위해서는 throws IOException를 통해 예외 처리하는 것이 필수입니다. 

    public class Main {
    	public static void main(String[] args) throws IOException { // 예외 처리
    		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
    	}
    }

     

    2. 출력과 출력 스트림 닫기

    String s = "Hello";	// 출력할 문자열
    
    bw.write(s + "\n");	// 출력할 내용 담기
    bw.flush();		// 출력과 동시에 버퍼 비우기
    bw.close();		// 출력 스트림 닫기

     

    백준 알고리즘을 풀어보며..

    처음엔 풀이하는 데에만 집중했지만 시간이 갈수록 시간과 메모리를 단축하는 데에 욕심이 생기는 것 같아요!

    이를 위해서는 반드시 BufferedReader와 BufferedWriter을 알고 있어야 할 것 같습니다.

    이해되지 않는 부분이 있다면 댓글 남겨주세요 :)

     

    참고(도움을 아주 많이 받은) 사이트 :
    백준, https://www.acmicpc.net/blog/view/56
    제이온, https://steady-coding.tistory.com/183#

Designed by Tistory.