이번에는 콘솔 입출력에 대해 알아보도록 한다.
오늘의 날씨는 어떻습니까? (흐림/맑음/눈/비) :
이렇게 사용자에게 문자열을 보여주는 것이 콘솔 출력이고 사용자가 답변을 입력하는 것을 콘솔 입력이라 한다.
[순서]
1. 콘솔 입력
1) InputStream
2) InputStreamReader
3) BufferReader
4) Sacnner
2. 콘솔 출력
위와 같은 콘솔 출력에 사용자는 흐림, 맑음~ 등의 답변을 입력할 것이다. 이때 입력 받은 값을 콘솔 입력이라하며, 자바 코드에서 문자열을 입력 받기 위해서는 System.in
을 사용한다.
아래의 예제를 보도록 하자
import java.io.IOException;
import java.in.InputStream;
public class Sample{
public static void main(String[] args) throws IOException{
InputStream in = System.in;
int a;
a=in.read();
System.out.println(a); //ascii 값 리턴
}
}
다음 문장에서 알 수 있듯, System.in
은 InputStream의 객체임을 알 수 있다.
InputStream in = System.in;
InputStream의 read메소드는 다음처럼 1byte의 사용자 입력을 받아들인다.
int a;
a = in.read();
in.read()
메소드로 읽은 1byte의 데이터는 0-255사이 정수의 아스키 코드값이 저장된다.
IOException
main 메소드에thorws IOException
을 사용한 부분이 있다.이는 InputStream을 통해 값을 읽어올때 IOException이 발생할 수 있어 throws를 통해 예외 처리를 뒤로 미뤄둔 것이다. 자세한 예는 다음 과정에서 알아보도록 한다.
이번에는 "abc"를 입력한 후 결과를 보도록하자.
97
전과 같이 97이 출력된다. 이는 InputStream의 read 메소드는 1byte만 읽기 때문이다. 따라서 "abc" 3 byte를 입력 했음에도 프로그램에서 1byte만 읽은 경우라 할 수 있다. 이렇게 사용자가 전달한 데이터를 다른 말로 스트림(Stream)이라 한다. 스트림은 이어진 데이터(byte)의 형태를 의미한다.
스트림?
수도관 A관에서 B관이 이어져 이동하는 물의 흐름이라 할 수 있다.
프로그래밍에서는 다음과 같은 것들을 스트림이라 할 수 있다.
- 파일 데이터(파일은 시작-끝이 있는 데이터의 스트림이다.)
- HTTP 송수신 데이터(브라우저가 요청하고 서버가 응답하는 HTTP 형태의 데이터도 스트림이다.)
- 키보드 입력 (사용자가 키보드로 입력하는 문자열은 스트림이다.)
만약 사용자가 입력한 3byte를 모두 읽어와야 한다면 어떻게 해야 할까?
int a;
int b;
int c;
a=in.read();
b=in.read();
c=in.read();
위처럼 read 메소드를 3번 실행하도록 수정할 수 있겠지만, 조금 더 개선된 방법을 사용할 수 있다.
byte[] a = new byte[3];
in.read(a);
System.out.println(a[0]);
System.out.println(a[1]);
System.out.println(a[2]);
3byte 길이 배열을 생성한 후 read 메소드의 입력값으로 전달하면 콘솔 입력이 해당 배열에 저장된다.
읽어 들인 값을 문자값 그대로 출력하기
위 예제를 다음과 같이 변경해보자.
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; // 추가
public class Sample{
public static void main(String[] args) thorws IOException{
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in); // 추가
char[] a = new char[3];// 변경 byte -> char
reader.read(a);
System.out.println(a);
}
}
InputStreamReader 객체 생성시 생성자 입력으로 InputStream이 필요
InputStreamReader reader = new InputStreamReader(in);
byte 대신 char 배열 사용 가능
char[] a = new char[3];
사용자 입력 전부 받아들이기
import java.io.IOException;
imoprt 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);
}
}
읽는 방법은 다음과 같다.InputStream(in) > InputStreamReader(reader(in)) > BufferedReader(bf(reader(in)))
참고
- InputStream - byte
- InputStreamReader - character
- BufferReader - String
J2SE 5.0부터 Scanner라는 java.util.scanner
클래스가 추가되었다. Scanner 클래스를 이용하면 콘솔입력을 보다 쉽게 처리할 수 있다.
import java.util.Scanner;
public class Sample{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println(sc.next());
}
}
Scanner 객체의 next() 메소드는 단어 하나(Token)을 읽어들인다.이 외 다양하게 읽어들일 메소드들을 보도록 하자.
이번에는 콘솔 출력에 대해 알아보자.
System.out.println
System.out
은 PrintStream 클래스의 객체이다. PrintStream은 콘솔에 값을 출력할 때 사용되는 클래스이다.보통 System.out.println
은 콘솔에 문자열을 출력할 경우나 디버깅 시 많이 사용된다.
System.err
도 있는데 System.out
과 동일한 역할을 한다.다만, System.err
는 오류 메시지를 출력할 경우 사용된다.
(...)
System.out.println("정상 출력");
System.err.println("오류 출력");
}
}
Unix 콘솔에서 위 코드를 통해 정상/오류 출력을 별도의 파일로 저장할 수 있다.
java Sample > out.txt 2> err.txt
* 유닉스에서 >는 일반 출력, 2>는 오류 출력에 해당된다.
Sample.class 파일을 생성한 후 위와 같이 실행하면 out.txt 파일에는 "정상 출력", err.txt파일에는 "오류 출력"이 저장된다.