[Java] Class Reader 문자열입력 스트림 클래스 알아보기.

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 변수로 변환되어 출력되는 것을 알 수 있다.