2011년 4월 22일 금요일

키보드로 글자 입력해서 화면에 출력하기


예제는 마우스로 클릭하면 확대된다. 안보인다고 항의하지 말자.^^
저번 시간에 우리는 원하는 내용을 자바 소스에다가 써서 화면에 출력시켜 보았다. 그러면 이번에는 미리 써놓지 말고 키보드로 원하는 값을 입력받아서 화면에 그 내용을 출력시키는 방법을 이번 시간에 알아보도록 하자. 자바를 이제 시작하는 이들은 상관없을 것이나 다른 자바 강좌나 교재를 공부해본 이들이라면 상당히 의아해 할 것이다. 자바의 입력에 관련된 부분은 대부분이 중간 이후에 언급하기 때문이다. 그런데 필자는 초반에 버젓이 입력부분을 건드리려 한다. 왜일까? 이유는 없다. 그건 여러분이 지금껏 본 강좌를 충실히 따라왔다면 가능할 것이라고 보는 믿음(?) 오직 그 믿음뿐이다.ㅎㅎ

출력을 했으면 입력은 어떻게 하는지 궁금한 것이 당연지사일 것이다. 허나 부분적으로 초반에 설명하기에는 난감한 부분들이 튀어나오기 때문에 보통 다른 곳에서는 나중으로 미루는데 필자는 그냥 정면돌파한다.^^ 메인메소드 공략에 성공한 여러분이라면 이번 내용도 무난하게 소화하리라 생각한다. 일단 위의 코드를 입력하고 실행해 본다. // 로 표시된 부분은 여러분의 이해를 돕기 위해 필자가 주석을 달아놓은 것이다. 따라서 굳이 타이핑 할 필요는 없다. 앞으로도 코드를 빠르게 해석하라고 저렇게 코드 옆에 설명을 달아볼까 한다. 좋냐? 침 닦아라. ^^

자 이제 본격적으로 위의 코드를 설명해 보겠다. 실행해 보았으면 어떤 내용인지 대충 감을 잡았을 것이다. 한 글자를 입력받아서 그 글자를 화면에 출력하는 예제이다. 위에서부터 차근차근 살펴보자. import 라고 되어있는 부분은 저번 시간에 필자가 설명을 했다. 필요한 클래스를 쓰기 위해서 다른 곳에서 가져온 것이다. 주석 달아놓은데로 클래스 일일이 쓸 필요없이 *표시를 이용해 한줄로 만들어도 상관이 없다. 이런 클래스들은 어디에 있고 어떤 순서로 있는지 궁금할지 모르겠는데 여러분이 자바를 설치했을때 설명서에 다 들어있는 내용이다. 자바 에디터를 사용하고 있다면 JDK Help나 JDK API 같은 버튼을 찾아 클릭해 보면 여러 패키지들을 볼수가 있는데 위의 써놓은 패키지들의 경로대로 찾다보면 나올 것이다. 에디터가 없는 이들은 자바 설명서를 자바 프로그램 메인폴더에 넣어놨다면 docs라는 폴더가 보일 것이다. 안으로 들어가면 api라는 폴더가 있는데 그 안에서 index.html을 클릭하면 여러 자바 패키지들을 찾아볼수가 있다. 우리는 이곳을 자바 라이브러리(library)라고도 한다. 도서관처럼 자주 찾으니까 말이다.

다시 프로그램으로 돌아와서 Test2 라는 이름의 클래스이니 파일이름도 당연히 똑같아야 할것이다. Test2.java 메인메소드를 찬찬히 살펴보면 다른 용어가 끝에 하나 보인다. throws IOException 이라는게 보이는데 처음 보았다고 겁먹지 말고 우리가 배운 노하우(?)를 적용해 해석하려 애를 써보기 바란다. throws 무슨 뜻인가? 뭐 던지다라는 뜻이다. 뭐를 던지나? IOException을 던지라고 한다. 그럼 IOException은 무엇인가? 글자에서 느껴지는게 없나? 호오~ 이제는 빨리 반응이 오는구나. 그렇다. 대문자로 시작함에서 역시 예상할수 있는 것은 IOException이 클래스라는 점이다. 클래스를 사용해야되므로 위에서 import라는 명령을 이용해 java.io 패키지를 불러온 것이다. 그럼 IOException 이라는 영어철자를 낱낱히 파헤쳐보자. IO+Exception = InputOutput+Exception = IOException 이제 감이 팍팍 오리라 믿는다. "input입력" "output출력" "exception예외" 필자가 영어공부까지 시켜주니 이보다 더 좋을수 있으랴. ㅎㅎ 즉, 입출력에 관한 예외를 던져버리라는 뜻인데 입출력에 관한 예외가 여기서 발생했을시 다른데로 보내라는 것이라고 해석하면 이해가 쉽겠다. 자바에서는 입출력에서 발생될지 모르는 에러들을 미리 예외처리를 해놓으라고 되어있다. 사용자가 뭘 입력할지 누군들 알겠냐(?)ㅎㅎ 이런 예외처리는 메소드 옆에 throws 라는 명령어를 통해 예외처리할 클래스를 지정하고 위와같이 사용하면 된다.

System.out.println("중얼중얼");은 저번에 설명했으니 알 것이고 다음줄의
int c=System.in.read(); 가 조금 어려울텐데 뜻은 이러하다. 설명전에 조금 뜸을 들이겠다.
위의 줄은 아래 두줄과 같은 뜻이다.
int c;
c=System.in.read();
이러면 이해가 쉬울지 모르겠다.
일단 int 는 "integer 정수"라는 뜻의 약자로 숫자를 뜻한다. 그리고 다음줄은 System 클래스를 이용해 in으로 그리고 read()라는 메소드를 이용해 키보드에서 사용자 입력값을 받으라는 뜻이다. 그 받은 입력값은 c라는 곳으로 보내지는데 여기서 =의 의미는 같다라는 의미보다는 컴퓨팅에서 관련값을 왼쪽 변수에 집어넣으라는 의미와 일맥상통한다. 키보드로 받은 값이 뭐가 될지는 모르지만 하여간 한 문자를 c에다가 넣고 뭔가를 하라는건데 뭔지 다음줄을 살펴보기로 하자.

System.out.println("입력한 문자는 "+(char)c+"입니다.");

이미 필자가 주석을 달아놓았지만 안의 내용이 조금 복잡해 보일 것이다. 차근차근 살펴보자. 괄호 양쪽 끝에는 따옴표가 있는데 안을 보니 또 따옴표가 있어 헤깔릴 것이다. +를 일단 주의깊게 보도록 한다. 자바에서 위의 System.out.println() 명령어를 통해 실행할시 문자열을 미리 써놓을수도 있지만 미리 써놓을수 없는 부분이 생겨나게 된다. 즉, 키보드로 사용자에게서 입력받을 c라는 값은 지금 현재로서는 사용자가 뭘 입력할지 모르니 미리 써놓을수가 없다. 따라서 값을 모르는 그런 변수를 출력해야 될때는 저렇게 미리 안내글 같은 문자열과 만나는 변수 양옆에다 +기호를  쓴다.

그럼 변수 앞에 있는 (char)은 무엇일까? char은 character의 약자로 저렇게 괄호로 앞에 있을때는 저 형태로 변환시키라는 이야기다. 어려운 말로 캐스팅(casting)이라고 한다. 여러분이 키보드로 입력한 값은 숫자를 치던 문자를 치던 자바는 컴퓨터 기호값으로 처리해서 읽어드리는데 이 값이 숫자이므로 c는 int 형태로 그 값을 받아야한다. 물론 사용자로부터 입력값을 맨처음에 받아들이는 read() 메소드도 결과값이 int 타입이니 c가 넘겨받을때도 당연히 int 타입이어야 한다. =이 성립하려면 양쪽부분의 자료형태가 똑같아야 한다. 너무 당연한가? 막상 말하니 어색하군.^^* 다음에 여러분이 입력한 값을 그대로 출력하려면 컴퓨터 기호값으로 읽어드린 것을 다시 여러분이 입력한 문자 형태로 만들어줘야 하는데 그 기능을 담당하는 것이 (char)를 이용한 캐스팅 기능이다. 즉, 읽어드린 int 타입의 컴퓨터 기호값을 다시 여러분이 입력했던 문자 형태로 되돌리라는 뜻이다. 이해가 잘 안되였다면 아래의 예제를 프로그램에 넣고 돌려보면 저절로 터득하게 될것이다.

System.out.println("입력한 문자는 "+(char)c+"입니다.");

System.out.println((char)c+"라고 입력하셨습니다.");
System.out.println("입력한 문자는 바로 "+(char)c);
System.out.println(c);

c가 문자열 앞쪽에 있을때랑 뒤쪽에 있을때 그리고 문자열이 없을때 +의 위치와 존재유무를 알게끔 써놓은 예제이다. 또한 맨 마지막 명령어를 통해서 문자로 캐스팅하지 않았을때는 컴퓨터가 여러분이 입력한 값을 어떻게 받아들이는지 알수 있을 것이다. 지금 이 자바 소스는 여러분이 입력하는 문자 하나만 받아들이고 출력하는 예제이므로 문자 여러개치고 엔터눌러도 맨 앞에 있는 문자 하나만 처리하니 착오없기 바라고 문자열을 받아들이는 예제는 말나온김에 다음 시간에 배워보겠다.^^

댓글 7개:

  1. 잘 봤어요 ㅎㅎ

    -Carter23

    답글삭제
  2. 감사합니다 ㅡ ㅎ

    답글삭제
  3. 강좌가 되게 재밌네요 ㅎㅎ

    답글삭제
  4. 그야말로 폭풍감동의 배움글이라고 할 수 밖에 ㅜㅜ
    정말 감사합니다

    답글삭제
  5. 하나씩 깨닫는 기쁨이 ~~감사합니다~~^^

    답글삭제
  6. 감사합니다!! 강좌 하나하나 아!!~!!하고 깨달으면서 배우고 있습니다

    답글삭제
  7. 초보 자바 아줌마인데요. 인터넷 보면서 독학중인데, 도움이 많이 됩니다. 감사합ㄴ다. 이번 강좌에서 질문은 입력하는 문자를 숫자7을 넣었는데, 왜 맨 마지막 System.out.println(c);에서 결과값이 55가 나오는지 궁금합니다...

    답글삭제