본문 바로가기

알고리즘/공부의흔적

[공부의흔적]_Buffer

자바에서 입력 받을 때 Scanner 클래스로 입력을 받았다. 하지만 속도 측면에서 BufferedReader를 사용하게 되면 훨씬 줄어들 수 있다.

- BufferedReader : Scanner와 유사

- BufferedWriter : System.out.println()과 유사

■ 특징

- 둘은 기존에 쓰던 Scanner와 System.out.println()보다 속도 측면에서 훨씬 빠르다.

- 입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되므로 데이터 처리 효율성이 높다.

- 많은 양의 데이터를 처리할 때 유리하다.

■ 단점

하지만 그에 비해 BufferedReader은 Enter만 경계로 인식하고, 받은 데이터가 String으로 고정되기 때문에 입력받은 데이터를 가공하는 작업이 필요한 경우가 많다.

■ 주요용어

- Buffer : 데이터를 한 곳에서 다른 하나 곳으로 전송하는동안 일시적으로 그 데이터를 보관하는 임시메모리 영역, 입출력 속도 향상을 위해 버퍼 사용

- Buffer flush : 버퍼에 남아 있는 데이터를 출력시킴(버퍼를 비우는 동작)

- BufferedReader : 버퍼를 이용한 입력

- BufferedWriter : 버퍼를 이용한 출력

■ 사용방법

① import

import java.io.*;로 입력해줘도 된다. (Ctrl + Shift + O)

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

② 주의사항

입력은 readLine()을 활용하는데, 주의해야 할 점이 있다.

첫번째, readLine()의 리턴값은 String이기 때문에 다른 타입으로 입력을 받으려면 형변환을 해줘야 한다. (number 변수를 int로 받기 위해 형변환을 한 것처럼)

두번째, 예외처리를 꼭 해야 한다. readLing()을 할 때마다 try&catch를 활용해도 되지만, 대개 throws IOException을 통하여 작업한다.

import java.io.IOException;
public static void main(String[] args) throws IOException {}

 

③ BufferedReader

- 데이터 라인 단위로 읽기 가능

- Scanner처럼 공백 단위로 끊어주지 못하고, 엔터만 경계로 인식

- return 값이 String으로 고정되기 때문에 String이 아닌 다른 타입으로 입력받으려면 형변환 해줘야 한다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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

		String s = br.readLine();	// String
		
		int number = Integer.parseInt(br.readLine());	// int
		
		// 공백구분방법1
		StringTokenizer st = new StringTokenizer(br.readLine());
		int a = Integer.parseInt(st.nextToken());	// 첫번째 호출
		int b = Integer.parseInt(st.nextToken());	// 두번째 호출
        // nextToken()을 사용하면 readLine()을 통해 입력받은 값을 공백단위로 구분하여 순서대로 호출
		
		// 공백구분방법2
		String array [] = s.split(" ");	// 공백마다 데이터 끊어서 배열에 입력
		
		br.close();	// 입출력이 끝난 후 닫기
	}
}

 

 

④ BufferedWriter

- 한 번에 모았다가 출력 가능

- 버퍼로 정의해줬기 때문에 반드시 flush()/ close()를 호출해줘야 함

- System.out.println()처럼 자동개행 기능이 없으므로 필요한경우 \n을 통해 따로 입력

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class Example {
	public static void main(String[] args) throws IOException {
		
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String s = "Hello World";	// 출력할 문자열 선언
		bw.write(s);	// 출력 
		bw.newLine();	// 줄바꿈 (출력에서 \n을 입력해도 됨 (bw.write(s + "\n)))
		bw.flush();		// 남아있는 데이터 모두 출력
		bw.close();		// 스트림 닫음
	}
}