BufferedReader & BufferedWriter
자바에 처음 입문하게 되면 가장 처음에 배우는 것이 입력과 출력일 것이다.
아마 대부분은 Scanner & System.out.println()으로 입출력을 해결할 것이다.(거의 무당)
만약, 입력과 출력이 엄청나게 많이 필요한 경우라면 기존에 사용하던 Scanner와 System.out.println()은 성능 면에서 메리트가 없다. 느리다는 것이다.
성능에 차이가 생기는 이유는 버퍼 사용 여부로 설명할 수 있다.
Scanner & System.out.println()
키보드에 입력이나 화면에 출력을 할때마다 프로그램에 곧바로 데이터를 전달한다.
BufferedReader & BufferedWriter
키보드에 입력이나 화면에 출력을 해야할 때마다 데이터를 버퍼에 저장해두고 버퍼가 가득차거나 개행문자가 나타나면 데이터가 담긴 버퍼의 내용을 한꺼번에 전달한다.
혹시 여기서 "데이터가 생길때마다 보내주는게 더 빠른 것 아닌가?" 라고 생각할수도 있다.
키보드나 모니터 같은 입출력장치들은 CPU와 속도 차이가 크기 때문에 입력할 때마다 데이터를 전송하는 것보다는 중간에서 한 번에 모아서 보내는 것이 훨씬 빠르다!
비유하자면 마트에 가서 필요한 물건을 하나씩 가져가서 계산을 하면 여러 개의 물건을 살 때는 비효율적일 것이다. 하지만 카트에 여러 개의 물건을 담아두고 계산대에 가서 한 번에 계산하면 바코드를 찍고, 결제하는 과정을 한 번만 진행할 수 있어 더 효율적이다.
BufferedReader
띄어쓰기 여부와 상관 없이 개행문자가 오기 전까지의 데이터를 String 타입으로 입력 받는다. 그래서 입력된 데이터를 가공해야 하는 경우가 있다.
BufferedReader 사용법
import java.io.BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
String s = br.readLine();
int n = Integer.parseInt(s); // int 타입으로 변환
readLine()이라는 메서드로 받는데, Scanner에서 사용하는 nextLine() 메서드처럼 개행문자가 들어오면 입력을 마친다.
String 타입으로 반환되기 때문에 타입 변환이 필요하다. 문자열을 공백을 기준으로 자르거나 한 글자씩 잘라 배열 또는 리스트 등의 형태로 만들고 싶다면 split() 메서드나 StringTokenizer를 사용해주면 된다.
BufferedReader의 메서드
메서드 | 설명 |
String readLine() | 개행문자가 입력되기 전까지 한 줄을 읽어온다. |
int read() | 한 글자만 읽어서 아스키코드 값으로 반환한다. |
void close() | 입력 스트림을 닫고 사용하던 자원들을 해제한다. |
많은 메서드들이 있지만 자주 사용하는 메서드만 적어두려고 한다.
BufferedWriter
System.out.println()의 역할과 같지만 다른 점은 출력 스트림을 통해 버퍼에 데이터를 담아주기 때문에 양이 많아지더라도 처리가 훨씬 빠르다. 개행이 필요하다면 \n이나 newLine() 메서드를 사용해야 한다.
BufferedWriter 사용법
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
...
bw.write(); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남은 데이터를 모두 출력
bw.close(); // 스트림 닫기
출력을 수행한 이후에는 flush()를 통해 남은 데이터를 모두 출력하고 close()로 출력 스트림을 닫아주어야 한다. 개행하는 방법은 write("\n")과 newLine()이 있다.
BufferedWriter의 메서드
메서드 | 설명 |
void write(int c) | 한 글자 쓰기 |
void write(String s, int offset, int length) | 문자열 s의 offset부터 length만큼 출력 |
void write(char[] buf, int offset, int length) | 문자형 배열 buf의 offset부터 length만큼 출력 |
void newLine() | 줄바꿈 |
void flush() | 출력 스트림에 남아 있는 모든 데이터를 출력한다. |
void close() | 출력 스트림을 닫는다. |
읽어주셔서 감사합니다!
'JAVA' 카테고리의 다른 글
[Java] 순열과 조합, 중복순열과 중복조합까지(재귀) (0) | 2022.10.23 |
---|---|
[Java] 소수 판별 함수(메소드) isPrime (0) | 2022.10.04 |
[Java] GCD 알고리즘(최대공약수) & LCM 알고리즘(최소공배수) (0) | 2022.10.03 |
[Java] 문자열 치환(공백, 특수문자) replace() 사용법 (0) | 2022.09.27 |
[Java] StringTokenizer 사용법, split()과의 차이 (0) | 2022.09.25 |