BufferedReader, BufferedWriter, StringBuilder

kdkdhoho·2022년 1월 25일
1

백준 구현문제를 푸는 중 10951: A+B-4문제와 15552: 빠른 A+B에서 더이상 ScannerSystem.out.println함수를 써서는 못푸는 문제가 나왔다.

그래서 이번 기회에 사용하면 유용할 BufferedReaderBufferedWriter에 대해 알아보자한다.


BufferedReader/Writer

  • 이름처럼 버퍼를 이용하여 읽고 쓰는 함수이다.
    버퍼를 사용하기 때문에 Scanner와 System.out.println()과 비교했을 때 효율이 굉장히 좋아진다.

  • 아래 그림과 같은 방식으로 버퍼가 사용된다.
    버퍼 설명 사진
    여기서 버퍼를 거쳐가는데 왜 더 빠르냐고 생각이 들 수 있다.
    이에 대한 대답은, 하드디스크나 키보드, 마우스같은 외부장치는 CPU에 비해 속도가 굉장히 느리다. 때문에 중간에 메모리 버퍼를 둬서 데이터를 묶어서 전송하는 것이 효율적이고 빠르다.

    예시를 들자면, 흙을 파서 언덕에 버리는데, 한 번 삽질할 때마다 가서 버리는 것보다 수레에 가득 채워서 한번에 나르는 것이 더 효율적인 것과 같은 이치이다.

    즉, 입출력해야하는 데이터의 양이 많을 경우 Buffer를 사용하는 것이 훨씬 유리하다.


사용법

그럼 이 좋은 BufferedReader/Writer를 어떻게 사용하는가?

BufferedReader

import java.io.*;

// 입력(n): 둘 째줄에서 입력 될 정수 개수, 무작위의 정수 n개
public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

		int n = Integer.parseInt(reader.readLine());
		int[] arr = new int[n];

//		StringTokenizer st = new StringTokenizer(reader.readLine());
//		for (int i = 0; i < n; i++)
//			arr[i] = Integer.parseInt(st.nextToken());
		String[] str = reader.readLine().split(" ");
		for(int i=0; i<n; i++)
			arr[i] = Integer.parseInt(str[i]);

		reader.close();

	}
}
  1. 버퍼로 읽는 한 line은 문자열이므로 적절한 형변환이 필요하고,
  2. 공백을 기준으로 값을 추출하기 위해 StringTokenizer 객체나 split()함수를 사용하면 된다.
  3. BufferedReader를 사용하기 위해 항상 IOException 예외처리를 해줘야한다!

BufferedWriter

import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));
		
		writer.write("Hello World"); // 출력버퍼에 쓴다.
		writer.flush(); // 출력버퍼를 비우면서 출력한다.
		
		writer.close(); // 출력버퍼를 종료한다.
	}
}
  1. write() 메소드를 이용해 버퍼에 데이터를 입력하고
  2. flush() 메소드를 이용해 버퍼에 담긴 내용을 비우면서 출력!
  3. close() 메소드를 이용해 버퍼를 종료한다.
  4. BufferedWriter도 마찬가지로 IOException 예외처리해준다!

StringBuilder

  • 하나의 문자열로 계속 연결시킨 뒤 한 번의 출력으로 모든 문자열을 출력시키는 방법이다.

  • 위에 언급한 StringBuffer는 여러 곳에서 동시에 같은 문자열 인스턴스에 접근할 때 중복 점유를 막을 수 있는 장치가 되어 있다.(동기화 처리) 때문에, StringBuilder에 비해 좀 더 무겁다.

  • 따라서 특별한 이유가 없다면 StringBuilder를 사용하는 것이 일반적이다.

사용법

기본적으로 초기화하는 것과 append(), System.out.print()로 출력하는 것만 알면 된다!

sb.append()에서 Sysout하듯이 매개변수를 넣어준다.

import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		int t = Integer.parseInt(br.readLine());
		for (int i = 0; i < t; i++) {
			String input = br.readLine();
			int sep = input.indexOf(" ");

			int a = Integer.parseInt(input.substring(0, sep));
			int b = Integer.parseInt(input.substring(sep + 1));

			sb.append((a + b) + "\n");
		}
		System.out.print(sb);

		br.close();
	}
}

이 블로그이 블로그, 이 블로그를 참조하였습니다.

profile
newBlog == https://kdkdhoho.github.io

0개의 댓글