일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스
- InteliJ
- node.js
- 인텔리제이
- 코어자바스크립트
- MySQL
- DART
- SQL
- class-transformer
- eqauls-hashcode
- Java
- JavaScript
- Stream
- tecoble
- @RequestBody
- datagrip 한글깨짐
- Mac
- 봤어요처리
- REST
- db
- oracle
- flutter mac 설치
- maven
- 프로젝트 여러 개
- javascript error
- svn
- Spring
- ojdbc6
- TypeScript
- Aspect
- Today
- Total
개발자가 되고 싶은 개발자
[Java] Buffer를 이용한 입출력 본문
안녕하세요, 오늘은 실무에서 자주 사용되는 BufferedReader에 대해 알아보겠습니다.
주로 입력 받을 때 사용하는 Scanner에 비해 상대적으로 빠른 속도를 보여줍니다.
버퍼란 무엇일까
버퍼링이라는 말 덕분에 버퍼라는 단어는 많이 들어보셨을 거라 생각됩니다.
컴퓨팅에서의 '버퍼'는 데이터를 한 곳에서 다른 한 곳으로 전송하는 동안,
일시적으로 그 데이터를 보관하는 메모리의 영역을 의미합니다.
다른 말로는 '큐'라고도 표현합니다.
https://ko.wikipedia.org/wiki/%EB%B2%84%ED%8D%BC_(%EC%BB%B4%ED%93%A8%ED%84%B0_%EA%B3%BC%ED%95%99)
언제 사용하면 좋을까??
주로 대용량 데이터 처리시에 사용됩니다.
간단한 프로그램을 작성할 때는, 데이터 형을 가공할 필요가 없는 Scanner을 사용하는 것이
더 적합하다고 생각합니다.
어떻게 더 빠를까??
받는 즉시 처리하지 않고, 보관했다가 처리하는데 어떻게 더 빠를까? 라고 생각하실 수도 있습니다.
예를 들어보겠습니다, 기생충의 기우네 집이 폭우로 인해 물에 잠겻습니다.
두 손으로 한 번씩 여러 번 왔다갔다 퍼내는 것과, 양동이에 모아서 한꺼번에 퍼내는 것.
둘 중에 어느 것이 더 효율적일까요?.
물론 상황에 따라 어떤 것이 효율적인지는 다르겠지만요!
Scanner와의 비교.
백준 알고리즘 문제의 2741번을 예시로 비교해보겠습니다.
우선 Scanner를 이용해서 작성해보았습니다.
import java.util.Scanner;
public class Main {
private static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
int N = sc.nextInt();
for (int i = 1; i <= N; i++) {
System.out.println(i);
}
}
}
코드 길이는 236, 시간은 672ms 가 나왔습니다.
다음은 Buffer를 이용해서 작성해보도록 하겠습니다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class Main {
private static Scanner sc = new Scanner(System.in);
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
for (int i = 1; i <= N; i++) {
bw.write(i+"\n");
}
bw.flush();
bw.close();
}
}
코드 길이는 644, 시간은 232ms가 나왔습니다.
코드길이는 3배 정도 늘었지만, 속도는 3배 정도 줄어드는 결과를 보실 수 있습니다.
이러한 간단한 예시로도 성능차이를 볼 수 있습니다.
사용법을 알아보겠습니다.
다음은 위의 예제를 주석을 통해 사용법을 설명드리겠습니다.
public class Main {
private static Scanner sc = new Scanner(System.in);
/* 예외처리는 필수입니다. 가독성을 위해 try문을 사용하지 않았습니다. */
public static void main(String[] args) throws NumberFormatException, IOException {
/* BufferedReader,writer을 import받습니다. */
//다양한 방법이 있지만, 콘솔로 입출력을 하기위해 Stream도 import해서 사용합니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
/* br객체를 이용해 입력한 값을 읽어오는 readLine()메소드는 문자형으로 읽어옵니다.
그래서 숫자형으로 형변환을 해줬습니다. */
int N = Integer.parseInt(br.readLine());
/* 기본적으로 개행이 되지 않기 때문에 개행을 해주어야 합니다. */
for (int i = 1; i <= N; i++) {
bw.write(i+"\n");
}
/* 스트림의 값을 출력해줍니다.
정확히 말하면 버퍼를 비워준다, 보내준다가 맞을 것 같습니다. */
bw.flush();
/* bw 객체를 닫아줍니다. 사실 close()함수가 닫기 전 자동으로 flush를 호출합니다. */
bw.close();
}
}
잘못된 부분은 알려주시면 수정하도록 하겠습니다. 감사합니다.
'Dev > Java & Spring' 카테고리의 다른 글
[SpringBoot] DB 연결 (0) | 2020.03.06 |
---|---|
[Spring] AOP 개념 (0) | 2020.03.03 |
[Spring] Maven Ojdbc6 에러 (0) | 2020.02.21 |
[JSP] HttpSession 인터페이스 (0) | 2020.02.13 |
[Java] ArrayList (0) | 2020.02.06 |