❓
백준 알고리즘문제를 풀기 시작하고, 아래와 같은 글을 읽게 되었다.
Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush 는 맨 마지막에 한 번만 하면 된다.
그 전까지의 문제를 Scanner와 System.out.println을 이용하여 풀었기 때문에, 위의 문장에 대해 한번에 이해할 수 없어 공부해야 할 필요성을 느끼게 되었다.
❗
1. Scanner, System.out.println?
1.1 Scanner
- java.util.Scanner에 포함된 클래스
- 입력되는 키 값을 공백으로 구분되는 토큰 단위로 읽는다.
- 기본 사용법
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
scanner.close();
* 여기서 System.in은, 키보드와 연결된 자바의 표준 입력 스트림
* Scanner에 대한 자세한 설명은 생략한다.
1.2. System.out.println
- java.lang 패키지에 포함되어 제공된다.
- 자바 표준 입출력 클래스
2. BufferedReader, BufferdWriter?
- Buffer에 있는 IO 클래스
- 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링 된 후 전달된다.
- 시스템의 데이터처리 효율성을 높여준다.
- 기본 사용법
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//선언
* 각 사용법에 대한 자세한 설명은 생략한다.
2.1. BufferedReader
- Enter만 경계로 인식하며, 받은 데이터가 String으로 고정되기 때문에 입력받은 데이터를 가공하는 작업이 필요한 경우가 많다. (Scanner에 비해 사용하기는 불편한 편)
- 하지만, 많은 양의 데이터를 입력받는 경우 효율면에서 훨씬 낫다
- 리턴값이 String으로 고정되므로, 다른 타입으로 입력받으려면 형변환이 필요하다
- 반드시 예외처리를 해주어야 한다.
2.2. BufferedWriter
- flush(), close()를 반드시 호출해주어 뒤처리를 해주어야 한다.
- 자동 개행 기능이 없기 때문에 개행이 필요한 경우 \n 을 통해 따로 처리해주어야 한다.
3. 차이점?
- 버퍼를 사용하지 않는 입력의 경우, 키를 누르는 즉시 바로 프로그램으로 전달된다. (+ 입력받은 즉시 자료형이 확정된다)
- 버퍼를 사용하는 입력의 경우, 키보드의 입력이 있을 때마다 한 문자식 버퍼로 전송한다. 버퍼가 가득 차거나 개행 문자가 나타나면 버퍼의 내용을 한번에 전송한다.
4. 그래서, 어떻게 사용하는거지?
- 백준 알고리즘 15552번 문제
4.1. Scanner와 System.out.println을 이용한다면 아래와 같이 풀었을 것......
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int T;
T = sc.nextInt();
for(int i = 0; i < T; i++) {
int A,B;
A = sc.nextInt();
B = sc.nextInt();
System.out.println(A+B);
}
}
}
4.2. BufferedReader, BufferedWriter를 사용해보자
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
//BufferedReader, BufferedWriter 사용시 예외처리 필수
//생성자
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
//키보드를 통해 입력받기
int N = Integer.parseInt(br.readLine());
//bufferReader 클래스의 메서드로 입력을 읽을 때, 라인 단위로 읽게 된다.
//특정 문자에 따라 문자열을 나누고 싶을 때 StringTokenizer를 이용하게 된다.
StringTokenizer st;
for (int i = 0; i < N; i++) {
//new StringTokenizer(문자열, 구분자): 구분자를 기준으로 문자열 분리
st = new StringTokenizer(br.readLine()," ");
//반환되는 타입이 String이므로, 형변환 (Integer.parseInt)
//형변환한 두 토큰을 더하여 BufferedWriter.write()에 담기
bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()))+ "\n");
}
//버퍼 닫기
br.close();
//버퍼 비우기, 닫기
bw.flush();
bw.close();
}
}
'Basic > 알고리즘' 카테고리의 다른 글
[Programmers] 신고 결과 받기 / HashSet, HashMap (0) | 2023.01.06 |
---|---|
소수점 자르기, 백분율 구하기 / 백준 4344번 (0) | 2021.08.02 |
JAVA sort() , copyOfRange() / 프로그래머스 K번째 수 (0) | 2021.07.28 |