- 자바 콘솔 입력에 대해 파헤치기
1. InputStream
자바에서 사용자가 입력한 문자열을 얻기 위해서는 아래와 같이 System.in을 사용한다.
import java.io.IOException;
import java.io.InputStream;
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
int a = in.read();
System.out.println(a);
}
}
위에서 사용한 System.in은 InputStream의 객체이며, InputStream은 자바의 내장 클래스이다.
InputStream의 read 메서드는 1byte 크기의 사용자의 입력을 받아들인다. (1byte의 데이터는 int로 저장된다.)
이때 저장되는 문자는 아스키코드로 0~255 사이의 정수값이 저장된다.
이렇게 사용자가 전달한 입력 데이터를 '입력 스트림'이라고 한다.
- 아스키 코드 표(ASCII Table)
그러나 InputSteam은 1byte 크기의 입력만 받아들일 수 있기에 문자열을 입력하면 맨 앞 문자만 출력한다.
'abc'라는 3byte의 데이터를 읽고 싶다면 어떻게 해야할까?
아래와 같이 1) read 메서드를 반복하거나, 2) byte 배열에 담으면 읽어들일 수 있다.
import java.io.IOException;
import java.io.InputStream;
public class Sample {
public static void main(String[] args) throws IOException {
InputStream in = System.in;
// 1. read 메서드를 반복
int a = in.read();
int b = in.read();
int c = in.read();
System.out.println(a);
System.out.println(b);
System.out.println(c);
// 2. byte 배열에 저장
byte[] x = new byte[3];
in.read(x);
System.out.println(x[0]);
System.out.println(x[1]);
System.out.println(x[2]);
}
}
2. InputStreamReader
읽어 들인 값을 항상 아스키코드 값으로 해석해야 하는 건 매우 불편하다.
InputStreamReader를 사용하면 byte 대신 문자로 입력 스트림을 읽을 수 있다.
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);
}
}
3. BufferedReader
아스키코드가 아닌 문자열이 나오는 것까지는 좋지만, 고정된 길이로만 스트림을 읽어야 한다는 게 불편하다.
BufferedReader를 사용하면 길이에 상관없이 사용자가 입력한 값을 받아들일 수 있다.
import java.io.BufferedReader;
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);
BufferedReader br = new BufferedReader(reader);
String a = br.readLine();
System.out.println(a);
}
}
InputStream부터 InputStreamReader, BufferedReader까지 콘솔 입력에 대해 정리해봤다.
객체를 감싸고 감싸고 또 감싸니 개념이 헷갈릴 수 밖에 없다. (이런 구조를 Decorator 패턴이라고 한다.)
InputStream의 구조를 간단하게 정리하면 아래와 같다.
- InputStream : byte를 읽는다.
- InputStreamReader : 문자(character)를 읽는다.
- BufferedReader : 문자열(String)을 읽는다.
참고문헌 : 박응용(2023), Do it! 점프 투 자바, 이지스퍼블리싱