오늘은 inputstream에 대하여 찾아보다가 자바 기본 입출력과 System.in.read라는 구문에 대해 확실하게 알기 위하여 공부해보았습니다.
● 자바에서는 기본적으로 ASCII 코드 값이 입력됩니다.
아래의 표를 살펴보면 대문자 'A'를 입력한다고 하면 아스키코드 값인 65가 return되어 출력되어집니다. 예를 들면 아스키코드값으로 13번은 CR로 정의되어 있습니다.
이것은 Enter를 정의한겁니다. 하지만 아스키코드 값은 잘 사용하지 않기 때문에 아스키 코드 값이 필요하다면 표를 보면서 사용하면 됩니다.
● System.in.read()
숫자 하나를 입력받아 그대로 출력하고자 할 때는 저런방식으로도 쓰지만 잘 사용하지 않습니다. 코드표를 살펴보면 숫자 0일 때 아스키코드값이 48이므로 -48을 해주므로 원래의 입력 숫자가 나오는 출력 방식입니다. 마찬가지로 숫자 5는 아스키값이 53입니다.(아래의 예시를 살펴보면 나와있습니다.)
● (char)System.in.read()
또한 받은 문자를 그대로 표시하고 싶다면 자료형 char로 형변환을 해주면 되는데 아스키 코드 값이 0~127까지 있으므로 모든 아스키코드는 char에 담을 수 있고 데이터의 손실도 없다는 말입니다.
아래의 코드를 살펴보면 숫자 80을 형변환 해보면 대문자 P, 숫자 66을 형변환하면 대문자 B가 나옵니다. 이렇게 char로 형변환을 하면 문자 하나를 그대로 입력하고 출력 할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
package Quiz;
import java.io.IOException;
public class inread {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
// Keyboard를 통하여 입력을 해봅시다.
// System.in.read(); == 아스키코드
System.out.print("입력 : ");
int anum = System.in.read();
System.out.println("출력 : " + anum);
// 엔터키를 눌러도 엔터값이 입력되기때문에 이값을 없애줘야 하므로 두개를 씁니다.
// 엔터키를 누를때 아스키코드 13번 값이 입력이 되고 개행이 될때 10번이 입력되기 때문입니다.
System.in.read();
System.in.read();
// System.in.read()-48 or '0'; == 숫자
System.out.print("입력 : ");
int num = System.in.read() - 48;
// int num=System.in.read()-'0';
System.out.print("출력 : " + num);
System.in.read();
System.in.read();
// (char)System.in.read(); == 문자
System.out.print("\n입력 : ");
char char_ = (char) System.in.read();
// int num=System.in.read()-'0';
System.out.println("출력 : " + char_);
}
}
|
cs |
● System.in.read(byte [ ])
문자열을 받아서 출력하는 것을 아래의 코드로 볼 수 있습니다. 키보드로 입력 시에 문자 하나당 byte값이 지정되어 있는데 문자가 여러개면 byte도 여러개를 받아 저장해야하므로 빈 배열을 인수로 받아서 System.in.read(byte [ ])에서 배열에 저장시켜줍니다. new String(byte [ ])은 byte를 문자로 바꾸어 줍니다. 이렇게 문자열을 입력하면 그대로 출력이 되는 것을 확인 할 수 있습니다.
● BufferdReader in = new BufferedReader(new InputstreamReader(System.in))
BufferedReader란 한줄 씩 입력 받기 위한 클래스라고 보시면 됩니다. BufferdReader 클래스의 생성자는 Inputstream을 입력받는 생성자가 없습니다. System.in은 Inputstream 타입이므로 BufferdReader의 생성자에 바로 들어갈 수 없기 때문에 InputstreamReader 클래스를 이용해야 하는 것입니다.
BufferdReader를 사용하면 문자열을 byte [ ]라던가 new String() 을 사용하지 않아도 문자열을 그대로 저장 할 수 있습니다. 한마디로 편의를 위해서 만든 클래스라고 생각하시면 됩니다. 다만 간단한 입력은 Scanner가 많이 쉽고 좋습니다. 하지만 BufferdReader를 사용한다면 좀 더 빠르게 코딩 할 수 있다고 봅니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package Quiz;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class quiz {
public static void main(String[] ar) throws IOException {
// System.in.read(byte[]);
byte[] arr = new byte[10];
System.out.print("문자열 입력:");
System.in.read(arr);// 키보드로부터 입력받은 값을 byte형태로 arr 에 저장
String str = new String(arr);
System.out.println("문자열 출력:" + str);
// BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("문자열 입력:");
String bufferstr = in.readLine();
System.out.println("문자열 출력:" + bufferstr);
/* Exception */
// 값을 외부로부터 입력받는 것이기때문에 어떤 오류가 생길지 모르므로 오류가 생겼을 시에 어떻게 처리 하라라는
// 명령을 코딩해줘야 하기 때문에 throws IOException 을 써준겁니다.
// Exception의 종류는 여러가지가 정의되어있고 InputOutputException의 줄임말로써 입출력 관련 오류가 정의되어있습니다.
// 위 방식은 메소드안에 모든 코딩에 IOException 에관련된 오류가나면 던져버려라(무시하라)라는 뜻으로쓰였습니다.
try {
in.readLine();// try{내용}catch(오류정의){내용}으로 try{내용}에서 내용부분을 실행하다가
// catch(오류정의)에서 정의한 오류가 발생하면 catch(){내용}부분에 내용을 실행하도록 하여
//오류를 잡는 구문입니다.
} catch (IOException e) {
System.err.println(e);// 에러가 나면 catch{내용}부분이 실행됩니다.
}
}
}
|
cs |
최근댓글