728x90
320x100
⚡️ Scanner
평소 Scanner를 통해 입출력을 진행하였는데, 복잡한 알고리즘을 풀면 시간초과가 발생하는 경우가 많았다.
시간 초과를 해결하기 위해 알아보다가 BufferedReader를 사용한다는 것을 알고 정리해보려한다
📌 Buffer
임시 저장 공간이라고 생각할 수 있다.
어떤 데이터가 전송 될 때, 일시적으로 저장되는 메모리 영역이다.
BufferedReader / BufferedWriter는 버퍼를 사용하여 읽기와 쓰기를 진행하는 함수이다.
버퍼를 사용하지 않고 입력하면 입력하자마자 바로 프로그램에 전달된다.
버퍼를 사용해서 입력하면 입력할 때마다 한 문자씩 버퍼로 전달한다.
➡️ 버퍼가 가득 차거나 혹은 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다.
입력받자마자 바로바로 전달하는 것보다는, 버퍼를 통해 한꺼번에 보내는 것이 더 효율적이다.
📌 BufferedReader
- Scanner : 입력을 받으면 바로바로 엔터가 나오자마자 전달된다.
- 띄어쓰기나 개행문자를 경계로 하여 입력 값을 인식하기 때문에 따로 가공할 필요가 없어 편리하다.
- 버퍼 사이즈가 1024 char이라 성능상 좋지 않다.
- 동기화가 되지 않기 때문에 멀티 쓰레드 환경에서 안전하지 않다.
- BufferedReader : 버퍼를 통해 임시로 저장되어있다가 한꺼번에 전달된다
- Enter(개행문자)만 경계로 인식하고 입력 받은 데이터가 String으로 고정되기 때문에 데이터를 가공하는 작업이 필요할 경우가 많다.
- 버퍼 사이즈가 8192 char(16,384byte) 이기 때문에 성능상 좋다
- 동기화 되기 때문에 멀티 쓰레드 환경에서 안전하다.
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int
- String으로 리턴 값이 고정되어 있어서 다른 타입으로 입력을 받고싶다면 형변환을 해줘야 한다
- readLine을 할때마다 예외처리를 해주는 것이 좋음
- try & catch를 활용하거나 throws IOException을 통하여 예외처리
- 주로 throws IOException 사용
✅ 데이터 가공
// StringTokenizer
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// String.split() 함수
String arr[] = s.split(" ");
BufferedReader를 통해 읽어온 데이터는 개행문자 단위(Line 단위)로 나누어지기 때문에 공백 단위로 데이터를 가공하고자 하면 따로 작업을 해주어야 함
- StringTokenizer
- nextToken()함수를 쓰면 readLine()을 통해 입력받은 값을 공백단위로 구분하여 순서대로 호출할 수 있음
- String.split()
- 배열에 공백단위로 끊어서 데이터를 저장하는 방식
📌 BufferedWriter
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "abcdef"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close(); //스트림을 닫음
- System.out.println("");
- 적은 양의 출력에서는 편리하고, 그렇게 큰 성능 차이 없이 사용할 수 있음
- BufferedWriter :
- 양이 많을 경우 입력과 동일하게 버퍼를 사용하는 것이 좋음
- 자동개행기능이 없기때문에 개행을 해주어야할 경우에는 newLine(); 혹은 \n을 사용하면 됨
- 버퍼를 잡아 놓았기 때문에 반드시 사용한 후에, flush()/ close()를 해주어야 함
- close()를 하게되면, 출력 스트림을 아예 닫아버리기 때문에 한번 출력후, 다른 것도 출력하고자 한다면 flush()를 사용하면 됨
Reference
728x90
반응형
'Language > Java' 카테고리의 다른 글
[JAVA] PriorityQueue 란? / 사용법 (0) | 2024.05.12 |
---|---|
[JAVA] Stack과 Queue (0) | 2024.05.02 |
[JAVA] Deque 덱 이란? (0) | 2024.05.02 |
[JAVA] 자바란 ? 자바의 특징 (0) | 2024.01.20 |