
1️⃣ 개요 - Buffer
Java 에서 데이터의 입출력을 수행하는 방법은 여러 가지가 있다.
그동안 나는 'Scanner' 을 주로 사용해왔다.
그러나 이 방식은 데이터의 수가 많아지면 속도가 느려진다는 단점이 있다.
이를 해결하기 위해 버퍼를 이용하는 방법이 있다.
그렇다면 '버퍼(Buffer)' 란 무엇인지 알아보자.
'버퍼(Buffer)' 란 데이터를 어느 한 곳에서 다른 곳으로 전송하는 동안 일시적으로
데이터를 보관하는 메모리의 영역이다.
쉽게 말해 지금까지 사용했던 Scanner 방식은 키보드에 입력하는 순간 바로 모니터에 출력된다.
버퍼를 사용하면 일정 조건을 만족할 때 까지 버퍼에 입력을 저장한다.
이후 일정 조건(개행 문자 등) 을 만족하면 모았던 버퍼를 한꺼번에 전송한다.
버퍼의 장점을 간략하게 알아보자.
1. 데이터를 묶어서 한 번에 전송하기 때문에 전송 시간이 줄어들어 성능이 향상된다.
2. 사용자가 데이터를 잘못 입력할 경우 수정이 가능하다.
물론 모든 입력 작업에서 버퍼가 좋진 않다.
예를 들어 게임과 같이 빠른 반응을 요구하는 작업에선 적합하지 않다.
2️⃣ BufferedReader , BufferedWriter
BufferedReader : 입력, Scanner 의 기능
BufferedWriter : 출력, System.out.print 의 기능
그러나 위 두 방식에는 차이점이 있다.
'Scanner' 은 자동으로 공백으로 구분되어 입력받아진다.
실제로 "Hello World!" 라는 문자열을 스캐너로 입력 받은 후 출력한다면,
"Hello" 만 출력된다는 것을 알 수 있다.
그러나 BufferedReader 은 Enter을 경계로 인식하고, 입력 데이터의 자료형을
String으로 고정하기 때문에 필요에 따라 데이터를 가공하는 작업이 필요하다.
우선 BufferedReader, BufferedWriter 을 사용하려면 다음을 import 해주어야 한다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
BufferedReader 을 사용할 때 InputStreamReader
BufferedWriter 을 사용할 때 OutputStreamWriter 가 함께 사용된다.
다음은 BufferedReader 을 선언하는 방법이다.
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str = bf.readLine(); // 문자열 입력
int i = Integer.parseInt(bf.readLine()); // 정수 입력
BufferedReader 은 String 타입으로 입력을 받는다.
Scanner 은 입력값을 원하는 자료형으로 받을 수 있다는 점에서 다르다.
'readLine()' 메소드를 통해 입력받는다.
따라서 정수형 데이터를 받기 위해선 Integer.parseInt(x) 를 사용해야한다.
참고로 이는 x 라는 데이터를 정수형으로 변환해주겠다는 의미이다.
여기서 주의해야 할 점이 두 가지 있다.
1. 모든 입력값은 String 타입으로 고정되기 때문에, 다른 자료형을 입력받는다면
꼭 형변환을 하여 필요한 데이터값으로 저장해야 한다.
2. 예외 처리를 꼭 해줘야 한다. 보통 main 함수 옆에 'throws IOException' 을 추가한다.
간단하게 예외 처리 하는 방법을 알아보겠다.
우선 다음과 같이 import 해주자.
그리고 main 함수 옆에 throws~ 코드를 추가한다.
import java.io.IOException;
public class Main{
public static void main(String[] args) throws IOException{
}
}
3️⃣ StringTokenizer
아까 데이터 입력 시 'Enter' 를 통해 구분된다고 하였다.
즉, 한 줄 단위로 입력받는다는 뜻이다.
따라서 공백 단위로 데이터를 나누기 위해선 추가 작업이 필요하다.
공백 단위로 데이터를 나누는 방법에는 대표적으로 두 가지 방법이 있다.
1. StringTokenizer 를 통해 공백 단위로 구분한다.
2. String.split() 함수를 통해 공백 단위로 끊어 배열에 저장한다.
* StringTokenizer 사용을 위해선
import java.util.StringTokenizer 을 해줘야 한다.
만약 공백 단위로 문자열을 나누기 위해선 다음과 같은 예제 코드가 있다.
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(bf.readLine());
String s = stk.nextToken(" ");
}
}
만약 다른 문자, 예를 들어 '-' 단위로 구분하고 싶다면
stk.nextToken("-"); 를 사용하면 된다.
이제 출력을 위해 BufferedWriter 사용법을 알아보자.
BufferedReader 와 사용법이 비슷하다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = "Hello World";
bw.write(str);
bw.flush();
bw.close();
1. bw.write() : 출력
* System.out.println 처럼 자동 개행을 해주지 않기 때문에, 줄바꿈을 위해선 'newLine()' 메소드나 bw.write('\n') 을 사용해야 한다.
2. bw.flush() : 버퍼를 사용한 것이기 때문에 반드시 사용 후 남은 데이터를 모두 출력해야 한다.
3. bw.close() : 출력 스트림을 닫는다.
4️⃣ 마무리
import java.util.StringTokenizer;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk=new StringTokenizer(bf.readLine());
String s=stk.nextToken(" ");
BufferedWriter br=new BufferedWriter(new OutputStreamWriter(System.out));
br.write(s);
br.flush();
br.close();
}
지금까지 공부한 내용을 바탕으로 간단한 입출력 프로그램을 작성했다.
1. BufferedReader 와 InputStreamReader 을 통해 입력받는다.
2. StringTokenizer 을 통해 공백 단위로 구분한다.
3. BufferedWriter 와 OutputStreamWriter 을 통해 출력한다.

1️⃣ 개요 - Buffer
Java 에서 데이터의 입출력을 수행하는 방법은 여러 가지가 있다.
그동안 나는 'Scanner' 을 주로 사용해왔다.
그러나 이 방식은 데이터의 수가 많아지면 속도가 느려진다는 단점이 있다.
이를 해결하기 위해 버퍼를 이용하는 방법이 있다.
그렇다면 '버퍼(Buffer)' 란 무엇인지 알아보자.
'버퍼(Buffer)' 란 데이터를 어느 한 곳에서 다른 곳으로 전송하는 동안 일시적으로
데이터를 보관하는 메모리의 영역이다.
쉽게 말해 지금까지 사용했던 Scanner 방식은 키보드에 입력하는 순간 바로 모니터에 출력된다.
버퍼를 사용하면 일정 조건을 만족할 때 까지 버퍼에 입력을 저장한다.
이후 일정 조건(개행 문자 등) 을 만족하면 모았던 버퍼를 한꺼번에 전송한다.
버퍼의 장점을 간략하게 알아보자.
1. 데이터를 묶어서 한 번에 전송하기 때문에 전송 시간이 줄어들어 성능이 향상된다.
2. 사용자가 데이터를 잘못 입력할 경우 수정이 가능하다.
물론 모든 입력 작업에서 버퍼가 좋진 않다.
예를 들어 게임과 같이 빠른 반응을 요구하는 작업에선 적합하지 않다.
2️⃣ BufferedReader , BufferedWriter
BufferedReader : 입력, Scanner 의 기능
BufferedWriter : 출력, System.out.print 의 기능
그러나 위 두 방식에는 차이점이 있다.
'Scanner' 은 자동으로 공백으로 구분되어 입력받아진다.
실제로 "Hello World!" 라는 문자열을 스캐너로 입력 받은 후 출력한다면,
"Hello" 만 출력된다는 것을 알 수 있다.
그러나 BufferedReader 은 Enter을 경계로 인식하고, 입력 데이터의 자료형을
String으로 고정하기 때문에 필요에 따라 데이터를 가공하는 작업이 필요하다.
우선 BufferedReader, BufferedWriter 을 사용하려면 다음을 import 해주어야 한다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
BufferedReader 을 사용할 때 InputStreamReader
BufferedWriter 을 사용할 때 OutputStreamWriter 가 함께 사용된다.
다음은 BufferedReader 을 선언하는 방법이다.
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String str = bf.readLine(); // 문자열 입력
int i = Integer.parseInt(bf.readLine()); // 정수 입력
BufferedReader 은 String 타입으로 입력을 받는다.
Scanner 은 입력값을 원하는 자료형으로 받을 수 있다는 점에서 다르다.
'readLine()' 메소드를 통해 입력받는다.
따라서 정수형 데이터를 받기 위해선 Integer.parseInt(x) 를 사용해야한다.
참고로 이는 x 라는 데이터를 정수형으로 변환해주겠다는 의미이다.
여기서 주의해야 할 점이 두 가지 있다.
1. 모든 입력값은 String 타입으로 고정되기 때문에, 다른 자료형을 입력받는다면
꼭 형변환을 하여 필요한 데이터값으로 저장해야 한다.
2. 예외 처리를 꼭 해줘야 한다. 보통 main 함수 옆에 'throws IOException' 을 추가한다.
간단하게 예외 처리 하는 방법을 알아보겠다.
우선 다음과 같이 import 해주자.
그리고 main 함수 옆에 throws~ 코드를 추가한다.
import java.io.IOException;
public class Main{
public static void main(String[] args) throws IOException{
}
}
3️⃣ StringTokenizer
아까 데이터 입력 시 'Enter' 를 통해 구분된다고 하였다.
즉, 한 줄 단위로 입력받는다는 뜻이다.
따라서 공백 단위로 데이터를 나누기 위해선 추가 작업이 필요하다.
공백 단위로 데이터를 나누는 방법에는 대표적으로 두 가지 방법이 있다.
1. StringTokenizer 를 통해 공백 단위로 구분한다.
2. String.split() 함수를 통해 공백 단위로 끊어 배열에 저장한다.
* StringTokenizer 사용을 위해선
import java.util.StringTokenizer 을 해줘야 한다.
만약 공백 단위로 문자열을 나누기 위해선 다음과 같은 예제 코드가 있다.
import java.util.StringTokenizer;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk = new StringTokenizer(bf.readLine());
String s = stk.nextToken(" ");
}
}
만약 다른 문자, 예를 들어 '-' 단위로 구분하고 싶다면
stk.nextToken("-"); 를 사용하면 된다.
이제 출력을 위해 BufferedWriter 사용법을 알아보자.
BufferedReader 와 사용법이 비슷하다.
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String str = "Hello World";
bw.write(str);
bw.flush();
bw.close();
1. bw.write() : 출력
* System.out.println 처럼 자동 개행을 해주지 않기 때문에, 줄바꿈을 위해선 'newLine()' 메소드나 bw.write('\n') 을 사용해야 한다.
2. bw.flush() : 버퍼를 사용한 것이기 때문에 반드시 사용 후 남은 데이터를 모두 출력해야 한다.
3. bw.close() : 출력 스트림을 닫는다.
4️⃣ 마무리
import java.util.StringTokenizer;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk=new StringTokenizer(bf.readLine());
String s=stk.nextToken(" ");
BufferedWriter br=new BufferedWriter(new OutputStreamWriter(System.out));
br.write(s);
br.flush();
br.close();
}
지금까지 공부한 내용을 바탕으로 간단한 입출력 프로그램을 작성했다.
1. BufferedReader 와 InputStreamReader 을 통해 입력받는다.
2. StringTokenizer 을 통해 공백 단위로 구분한다.
3. BufferedWriter 와 OutputStreamWriter 을 통해 출력한다.