* 본 게시물은 이지스퍼블리싱 [Do it! 점프 투 자바] 서평단 미션 수행 및 학습 목적으로 작성하였습니다.
모든 내용, 디자인, 이미지, 편집 구성의 저작권은 이지스퍼블리싱(주)와 지은이에게 있으며
학습 목적으로 내용을 재구성하여 작성했음을 밝힙니다. 문제시 삭제하도록 하겠습니다.
InputStreamReader
이전 게시물에서 설명했지만, 읽어 들인 값을 항상 아스키 코드 값으로 해석한다면
불편하기 때문에 byte 대신 문자로 입력 스트림을 읽기 위해 InputStreamReader를 사용한다.
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; // ①
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in); // ②
char[] a = new char[3]; // ③
reader.read(a);
System.out.println(a);
}
}
이전 InputStream 코드에서 추가된 내용은 주석으로 숫자를 달아놨으니 참고
- InputStreamReader를 사용하기 위해 import문이 하나 더 추가 됐다.
- InputStreamReader는 객체를 생성할 때 생성자의 입력으로 InputStream 객체가 필요하다.
InputStreamReader reader = new InputStreamReader(in); - InputStreamReader를 이용해 char 배열을 만들었다.
char[] a = new char[3];
코드에서 'InputStreamReader'를 사용해 'System.in'에서
byte Stream을 char Stream (문자 스트림)으로 변환한 후
read(a) 메서드를 호출해 입력 문자를 'a'라는 길이가 3인 문자 배열에 읽어 올 때
입력한 글자 중 new char[3] 첫 3글자까지만 출력된다.
BufferedReader
고정된 길이로만 스트림을 읽어야 하는 것에 대한 불편함이 있었다면
길이에 상관없이 사용자가 입력한 값을 모두 받아들일 수 있는 방법은
바로 BufferedReader이다.
import java.io.IOException;
import java.io.BufferedReader; // ①
import java.io.InputStream;
import java.io.InputStreamReader;
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in); // ②
BufferedReader br = new BufferedReader(reader); // ③
String a = br.readLine(); // ④
System.out.println(a);
}
}
- BufferedReader 클래스를 import문 추가한다.
- InputStream을 InputStreamReader로 변환한다.
- InputStreamReader를 이용해 BufferedReader를 생성한다.
- readLine() 메서드를 호출해 사용자가 입력한 한 줄을 읽어온 후 그 값을 'a'라는 문자열 변수에 저장한다.
readLine()은 Java에서 BufferedReader 클래스에서 제공하는 메서드 중 하나이다.
InputStream in = System.in; // byte를 읽는다.
InputStreamReader reader = new InputStreamReader(in); // character(문자)를 읽는다.
BufferedReader br = new BufferedReader(reader); // String(문자열)을 읽는다.
교재에는 나와있지 않지만 세 줄의 코들르 한 줄로 작성하는 방법도 있다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
new InputStreamReader(System.in)
System.in에서 읽은 바이트를 문자로 변환하는 InputStreamReader 객체를 생성하고,
그것을 다시 BufferedReader로 감싸서 텍스트를 효과적으로 읽을 수 있다.
객체를 각각 만들어 사용해야 한다 VS 객체를 한 줄로 만들어 사용해야 한다. |
성능 면에서 볼 때, BufferedReader를 객체로 각각 생성하는 것은 약간의 오버헤드가 발생할 수 있지만, 이것은 대부분 무시할 수 있는 수준의 오버헤드이다. 따라서 코드를 간결하게 유지하고 가독성을 높이기 위해 BufferedReader를 각각 만들어 사용하는 것이 일반적으로 좋은 방법이다. 한 줄로 만들어 사용하면 코드가 더 간결하긴 하지만, 여러 곳에서 동시에 사용하는 경우 동기화 문제가 발생할 수 있으므로 조심해야 한다. 요약 : 성능상의 큰 차이가 없는 한, BufferedReader를 각각 만들어 사용하는 것이 가독성과 유지 보수 측면에서 더 낫다. |
Scanner
import java.util.Scanner;
public class Sample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); // 콘솔 입력인 InputStream이 필요하다는 의미
System.out.println(sc.next());
}
}
J2SE 5.0부터 java.util.Scanner 클래스가 새로 추가 됐는데
Scanner 클래스를 이용하면 콘솔 입력을 보다 쉽게 처리할 수 있다.
Scanner 객체의 next() 메서드는 한 개의 token*을 읽어 들인다.
token*은 공백으로 구분되는 단어, 숫자, 기호 등
정보의 최소 단위로 문법적인 의미가 있는 문자열을 의미한다.
Scanner 클래스에는 토큰 뿐만 아니라 nextLine(라인), nextInt(정수) 등
숫자, 문자열 등을 읽어 들일 수 있는 메서드들이 있다.