* 본 게시물은 이지스퍼블리싱 [Do it! 점프 투 자바] 서평단 미션 수행 및 학습 목적으로 작성하였습니다.
모든 내용, 디자인, 이미지, 편집 구성의 저작권은 이지스퍼블리싱(주)와 지은이에게 있으며
학습 목적으로 내용을 재구성하여 작성했음을 밝힙니다. 문제시 삭제하도록 하겠습니다.
[Do it! 점프 투 자바] 06. 자바의 입출력 (Stream이란? / throws IOException / InputStream in = System.in; )
* 본 게시물은 이지스퍼블리싱 [Do it! 점프 투 자바] 서평단 미션 수행 및 학습 목적으로 작성하였습니다. 모든 내용, 디자인, 이미지, 편집 구성의 저작권은 이지스퍼블리싱(주)와 지은이에게 있
3mmmeee.tistory.com
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(정수) 등
숫자, 문자열 등을 읽어 들일 수 있는 메서드들이 있다.