2021-03-01
- 정의
Reader는 FileReader / BufferedReader / InputStreamReader의 최상위 클래스이다. 오늘은 문자열 스트림을 받아들이는 이 Reader(문자열 기반 스트림 최상위 클래스) 클래스에 대하여 알아보도록 하자.
- 특징
Reader reader = System.in;
기존의 inputstream은 System.in을 매개 값으로 받아 객체를 생성할 수 있었다. 하지만 Reader 클래스의 경우 문자열 스트림이기 때문에 직접적으로 inputstream을 받아들일 수 없고 반드시 문자열 스트림 타입으로 변환된 자식 클래스를 받아들여야지 객체가 생성된다. ( Reader 역시 추상 클래스이기 때문에 자기 자신을 new 연산자를 통해 객체를 생성할 수 없다.)
- 선언
package tReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
public class Main {
public static void main(String[] args) {
Reader r1 = new InputStreamReader(System.in);
}
}
선언시 Reader의 자식 클래스와 이 자식 클래스의 생성자에 inputstream을 넣어주어 문자열 기반 스트림으로 변경된 객체를 만들게 된다.
- read ( ) 메소드
package tReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
public class Main {
public static void main(String[] args) {
Reader r1 = new InputStreamReader(System.in);
// 그냥 Read 메소드는 한개의 문자를 읽고
// int 형 타입으로 리턴한다.
int temp = -1; // 입력받을 문자를 임시로 담아둘 변수
System.out.println("문자를 입력하세요 - - - > ");
try {
while((temp = r1.read()) != -1) { // -1이면 더이상 받을 문자열이 없음
char ch1 = (char) temp;
// 때문에 read로 받은 문자를 읽을려면
// (char) 같이 강제 형변환을 해주어야 한다.
System.out.println(ch1);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
r1.close(); // 사용끝났으면 닫아주기
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
read 메서드는 한 개의 문자를 읽고 이를 int형으로 리턴하게 된다. 여기서 temp 변수는 이러한 read메서드로 리턴된 인트형 데이터를 담아둘 변수이며, 이 temp 값이 -1일 경우 받은 문자 데이터가 더 이상 없다는 의미이기 때문에 while문이 종료되게 된다.
이후 문자 char형으로 강제 타입 변환을 하면, read로 입력받은 문자 데이터를 확인할 수 있다.
(Hello를 입력받아 각각 하나의 char형 데이터 ( H, e, l, l, o)로 분해되어 출력되는 것을 알 수 있다.)
- read ( char [] cArr ) 메서드
다만 한 글자 씩 데이터를 받을 경우 많은 문자열을 입력받을 경우 그에 따른 loop 횟수가 증가하여, 프로그램의 성능을 저하하게 만들 수 있다. 때문에 read 메소드는 char 형 배열을 매개 값으로 받을 수 도 있는데, 이 경우 해당 배열의 크기만큼 한 번에 문자들을 입력받아 전체적인 loop의 반복 횟수를 줄여 프로그램 성능을 향상시킬 수 있다.
package tReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
public class Main {
public static void main(String[] args) {
Reader r1 = new InputStreamReader(System.in);
// 그냥 Read 메소드는 한개의 문자를 읽고
// int 형 타입으로 리턴한다.
char [] cArr = new char[5];
// Reader의 read 메소드는 문자열만 받기 때문에
// 문자열 배열을 매개값으로 받는다.
int temp = -1; // 입력받을 문자를 임시로 담아둘 변수
System.out.println("문자를 입력하세요 - - - > ");
try {
while((temp = r1.read(cArr)) != -1) { // -1이면 더이상 받을 문자열이 없음
String str = new String(cArr, 0, temp) ;
// char 배열로 읽은 데이터를 담아야 하기 때문에
// String에 담아야하며, 현재 받아들인 길이만큼만
// 담아야한다. 0(처음부터) / temp(받아들인 길이까지)
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
r1.close(); // 사용끝났으면 닫아주기
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
char 형 배열의 크기가 5이기 때문에 한 번에 5개의 문자열을 입력받을 수 있다. 때문에 더는 char 변수만으로는 출력이 어렵기 때문에 char형 배열을 문자열 타입의 변수로 형 변환하여 출력해야 한다.
결과를 확인해보면 한 번의 5개의 문자열을 char 배열 버퍼에 담아 String 변수로 변환되어 출력되는 것을 알 수 있다.