블로그 이전, 2023. 1. 11. 22:15 에 작성했던 글입니다.

1.BufferReader란?
BufferReader는 Scanner처럼 즉시 전달하지 않고 버퍼에 저장했다가 버퍼가 가득 차거나 개행문자가 나타나면
버퍼의 내용을 한 번에 전송한다.
물을 퍼 나를때 물바가지에 담아서 매번 전달하는 것보다 큰 물통에 담아 한 번에 전달하는게 더 빠른 것처럼
Scanner보다 버퍼를 사용한 BufferReader가 더 빠르다.
다만 데이터를 String으로 받기때문에 데이터를 따로 가공해야해서 번거롭다.
2.BufferReader 사용법
BufferReader는 개행문자를 경계로 인식하고 IOException 예외 처리를 반드시 해야한다.
BufferReader의 메소드는 여러개 있지만 주로 쓰는 건 'readLine()'와 'close()'다.
이 문제에서 이용하는 두 개의 메소드만 설명하겠다.
먼저 readLine()을 사용하면 데이터를 한 줄씩 읽을 수 있고 readLine()의 반환값은 String이다.
데이터를 String으로 받기 때문에 다른 타입으로 사용하려면 형변환을 해야한다.
이 문제의 경우 int형으로 쓰려면 Integer.parseInt()를 사용해서 바꿔야한다.
3.StringTokenizer
readLine()을 사용해서 데이터를 한 줄 씩 읽어오는데, 문자열을 분리하고 싶다면
String을 token단위로 끊어주는 StringTokenizer 클래스를 사용하여 하나의 문자열을 분리할 수 있다.
StringTokenizer 생성하는 방식
StringTokenizer st = new StringTokenizer(문자열); => 띄어쓰기를 기준으로 문자열 분리
StringTokenizer(문자열,구분자) : =>구분자를 기준으로 문자열 분리
nextToken() 메서드를 사용해서 한 토큰씩 꺼낼 수 있다.
BufferReader를 더 이상 사용 안한다면 close()를 통해서 입력 스트림을 닫고 사용하던 자원을 해제하면 된다.
4.BufferedWriter의 사용법
이 문제에 사용되는 메서드는 'write()', 'flush()', 'close()' 이다.
BufferedWriter도 IOException 예외 처리를 반드시 해야한다.
'write()'는 출력할 내용을 담고 'flush()'를 통해 버퍼를 비워내는 동시에 콘솔에 출력한다.
'write()'를 사용했으면 꼭 'flush()'도 같이 사용해야한다.
출력이 끝났으면 'close()'를 통해 스트림을 닫는다.
5.InputStreamReader와 OutputStreamWriter
Stream은 데이터를 운반하는데 사용되는 연결통로다.
Stream은 단방향통신만 가능하기 때문에 하나의 스트림으로 입력과 출력을 동시에 처리할 수 없다.
그래서 입력과 출력을 동시에 수행하려면 입력을 위한 입력스트림(input stream)과 출력을 위한 출력스트림(output stream)이 필요하다.

InputStreamReader와 OutputStreamWriter은 바이트 기반 스트림을 문자기반 스트림으로 연결시켜주는 역할이다.
바이트기반 스트림의 데이터를 지정된 인코딩의 문자데이터로 변환하는 작업을 수행한다.
문제에 필요한 InputStreamReader/OutputStreamWriter 메서드만 설명하겠다.
| 생성자/메서드 | 설명 |
| InputStreamReader(InputStream in) | OS에서 사용하는 기본 인코딩의 문자로 변환하는 InputStreamReader를 생성한다. |
| OutputStreamWriter (OutputStream out) | OS에서 사용하는 기본 인코딩의 문자로 변환하는 OutputStreamWriter를 생성한다. |
System.in : 콘솔로부터 데이터를 입력받는데 사용
System.out : 콘솔로 데이터를 출력하는데 사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
앞의 내용들로 이 문장을 분석하면, System.in은 콘솔로부터 데이터를 입력받을 때 사용한다. inputStream 타입의 필드인 System클래스의 in 정적필드다. System.in으로 받은 InputStream 객체에 read함수를 실행하면 1byte밖에 읽지 못해 2byte인 한글은 읽을 수 없다. 그래서 InputStreamReader를 사용하는 것이다.
InputStreamReader은 InputStream객체를 입력으로 갖고 있어야하기 때문에 new InputStreamReader(System.in)과 같은 형태가 된다. InputStreamReader가 되면서 byte로 받는 수준에서 char로 받을 수 있게 되었다. 하지만 배열 크기를 일일이 지정해줘야 해서 불편하다.
BufferReader로 InputStreamReader를 입력받아 문자열을 출력함으로써 불편함을 해소했다.
BufferReader는 위에서 설명했으니 생략
내가 작성한 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //선언
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //선언
int t = Integer.parseInt(br.readLine()); //String을 int로 형변환
for (int i = 0; i < t; i++) {
StringTokenizer st = new StringTokenizer(br.readLine()," "); //문자열을 구분자를 기준으로 나눔
//StringTokenizer st = new StringTokenizer(br.readLine()); //이것도 가능
int n1 = Integer.parseInt(st.nextToken()); //한 토큰씩 꺼내 저장
int n2 = Integer.parseInt(st.nextToken());
bw.write(n1+n2+"\n");
}
bw.flush();
br.close();
bw.close();
}
}
개발 초보입니다. 틀린 부분이 있으면 알려주시면 감사하겠습니다.
'알고리즘 리뷰' 카테고리의 다른 글
| 백준 JAVA 3009 네 번째 점 리뷰 (0) | 2023.08.29 |
|---|---|
| 백준 JAVA 11943 파일 옮기기 리뷰 (0) | 2023.08.29 |
| JAVA 백준 2338 긴자리 계산 리뷰 (0) | 2023.08.29 |
| JAVA 백준 10809 알파벳 찾기 리뷰 (0) | 2023.08.29 |
| JAVA 백준 11654 리뷰 (0) | 2023.08.29 |