본문 바로가기

LECTURE/# java basic

[초급 JAVA]자바 기본 입 출력 - System 클래스 / System.in.read();

반응형

자바 기본 입 출력 - System 클래스 / System.in.read();

Intro

드디어 자바 포스팅을 쓰게되네요. 많이준비해 놓은만큼 빠르게 쓰도록하겠습니다. 그리고 제가 포스팅할때 사용 한 모든 java클래스들은 github에 저장해놓을테니 필요하신분들은 그곳에서 퍼가세요. ^^ 

Programming

 

ExamIn.java


package system;
import java.io.IOException;
public class ExamIn {
public static void main(String[] ar) throws IOException {
// 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.println("출력 : " + num);
System.in.read();
System.in.read();
// (char)System.in.read(); == 문자
System.out.print("입력 : ");
char char_ = (char) System.in.read();
// int num=System.in.read()-'0';
System.out.println("출력 : " + char_);
}
}

System.in.read();

기본적으로 아스키 코드값이 입력됩니다. 키보드의 모든 자판에는 아스키코드가 지정되어있습니다. 

 


표를 보시면 아시겠지만 대문자 'A'를 입력하게되면 아스키코드값 65가 return되어서 출력됩니다. 주석에서 설명하였지만, 아스키코드값으로 13번은 CR로 정의되어있죠? 이건 Enter를 정의한겁니다. 10번은 개행에대한 아스키코드값이고요. 


System.in.read()-48 or '0'

모두 이해하셨겠지만, 다시한번 간단히 설명드리자면 숫자 하나를 입력받아 그대로 출력하고자 할 때, 저런방식으로도 씁니다.(아주잘 안씁니다.^^) 코드표를 보시고 숫자 0을 찾아봅시다. 아스키값이 48입니다.  그리고 1씩 증가할때 아스키값도 1씩증가하므로 48을 빼주면 원하는 값이 남는 것을 알 수있습니다. 예를 들면 숫자 5는 아스키값이 53이고, 여기에 48을 빼면 5가남죠? 문자 '0'도 아스키값이 48이므로 48을 빼라는 뜻입니다.

(char)System.in.read()

받은 문자 그대로를 표시하고싶으면 문자를 가지는 자료형 char 로 형변환을 해주면됩니다. 표를 보시면 아시겠지만, 아스키 코드가 0~127 까지 있으므로 char의 범위안에 모두가 포함되겠죠? 그말은 모든 아스키코드는 char에 담을 수도 있고 데이터의 손실또한 없다는 겁니다. 숫자 65를 char로 형변환 해보세요. 대문자 A가 나옵니다. 이렇게 1:1로 대칭되게 바뀌게되므로 아스키코드값을 그대로받아서 char로 형변환 하면 문자 하나를 입력받아 그대로 출력 할 수 있습니다.


 
ExamIn2.java
package system;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ExamIn2 {
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{내용}부분이 실행됩니다.
}
}
}


이번에는 ExamIn2.java에서 문자열을 받아서 출력하는 예제로 설명하겠습니다.


System.in.read(byte [])

키보드로 입력을 하면 문자 하나당 byte값이 지정되어있습니다. 문자가 여러개라면 바이트도 여러개를 받아서 저장해야하니, 빈 배열을 인수로 받아 System.in.read(byte [])에서 배열에 저장시켜줍니다. 속이 빈 byte[]을 크기가 10으로 정의하여 초기화하고 이걸 인수로 넣고 console창에서 문자열을 입력해보세요. (이 때 문자는 10개까지만 되겠죠?)  new String(byte [])은 byte[]을 문자로 바꾸어 리턴해줍니다.  이걸 그대로 출력해도 좋습니다. 그럼 입력한 문자열이 그대로 출력이 되는걸 볼 수 있습니다.

BufferedReader in =new BufferedReader(new InputstreamReader(System.in));

BufferedReader는 아직 그 원리나 쓰임새에대해 자세히 몰라도됩니다. 그냥 공식처럼 외우세요. BufferedReader를 사용하면 문자열을 byte [] 이라든가 new String()이라던가 그런걸 안써도 그대로 문자열을 저장 할 수있습니다. 편의를 제공하기위하여 만든 Class입니다. 이밖에도 Scanner 클래스도 있지만 이건 utill 패키지안에 있기때문에 , System을 공부하는 지금 등장하는건 시기상조라고 판단했습니다. ^^; 저도 처음 배울때 BufferedReader를 사용하여 했고 지금도 많이쓰는(지금은 다른용도로쓰지만요 )거니 지금 외우신다고 손해보는건 없습니다. 다만 간단한 입력은 Scanner가 많이 쉽고 좋지만요. 길어도 BufferedReader를 쓰도록합시다. 당분간! 

BufferedReader로 생성한 객체 in 으로 readLine() 메소드를 호출하면 입력을 완료할때까지 대기하다 엔터키를 누르고 완료하게되면 입력받은 내용을 알아서 문자열로 바꾸어 return해줍니다. BufferedReader를 사용하면 좀더 빠르게 코딩 할 수 있겠죠?


Closing

소스는 모두 올려놓았습니다. github 링크는 나중에 좀더 자료가 많아지면 수정해서 올려놓도록하겠습니다. 일단 copy&paste를 해서 결과를 눈으로 확인하시고 설명을 보면서 직접 코딩을 해보세요. 대부분의 설명은 소스안에 주석에 써놓았으니, 주석을 참고하여 설명을 봐주세요.



반응형