2011년 4월 23일 토요일

키보드에 문자열 입력받아서 화면에 출력하기


오늘은 클래스 Test3를 통해서 문자열을 출력하는 방법을 알아보기로 하자. 위의 보이는 소스를 지금 빨리 치고 실행해 본다. 하지도 않고 그냥 설명만 읽으려는 게으른 이들(?)이 없길 바라면서 본격적인 강좌를 시작하겠다. 저번 시간에는 문자 하나를 키보드로 입력받아 출력시키는 예제를 살펴보았다. 무슨 차이가 있는지 나름대로 비교해서 생각해 보도록 해라. 10분 줄테니 끝나면 다음 단원을 계속해서 보기 바란다.

문자열을 읽어드리기 위해선 저번에 설명한 System.in.read() 명령어로는 부족하므로 문자열을 읽을수 있는 다른 클래스들이 필요하다. 특히 필자가 저번 강좌에서 컴퓨터 프로세스에서 이루어지는 입력과 출력 부분을 풀어서 설명하였는데 그 과정이 이번에 InputStreamReader라는 클래스와 BufferedReader라는 클래스를 통해 적나라하게 나타날 것이니 코드가 조금 길어졌지만 이해하는데 큰 무리가 없을 것이다.

자, 그럼 본격적으로 코드를 해석해 보도록 하자. 일단 예제 클래스 Test3 에서 필요한 클래스들을 불러와서 써야한다. 총 4개의 클래스가 필요하며 그 중에 System 클래스는 자동적으로 자바에서 포함되므로 이를 뺀 나머지 클래스는 총 3개 즉, InputStreamReader, BufferedReader, IOException 클래스가 되겠다. 이중 IOException 예외처리 부분은 저번 시간에 설명하였으니 또 이를 빼면 달랑(?) InputStreamReader와 BufferedReader 클래스만 써먹을줄 알면 만사 ok다. 갑자기 마음의 짐을 덜지 않았나? ㅎㅎ

이해를 돕기 위해서 영어공부를 잠시 하겠다. "stream (수많은 일의) 연속이나 이어짐" 이런 뜻을 가지고 있는데 개울이나 시내란 뜻도 있는걸 보니 계속해서 흘러가는 길이 있어 이런 뜻으로 해석되는듯(?)하다. 여기서도 그런 관점에서 봐도 무방하겠다. 입력장치(키보드)에서 출력장치(모니터)로 데이터를 보내야하는데 이 중간에 길이 있어야한다. 그 역활을 InputStreamReader가 해주고 있다라고 생각하면 된다. 그리고 buffer는 사전에서 찾아보면 완충제, 완충장치라는 뜻이 가깝긴 한데 그보다는 각 장치나 프로세스에서 공유되는 데이터를 저장하는 공간이라고 해석하면 더 이해하기가 쉬울 것이다. 다시 연결해서 설명하자면, 키보드에서 받은 값을(readline()) 입력장치 버퍼에서 일단 기억해놓고(System.in이 버퍼기능을 수행) 받은 데이터를 스트림을 통해 보내(InputStreamReader) 출력장치 버퍼에서 다시 데이터를 읽어들여(BufferedReader) 여러분의 모니터로 송신하는 과정이라고 말할수 있겠다. 이해가 쉽도록 반어거지(?)로 말을 만들긴 하였지만 이해하는데 무리는 없을거라 생각한다.^^

그럼 돌아가서 다시 코드를 보자. 코드는 이해하기 쉬우라고 일련의 과정들을 순서대로 정리해서 쓴것인데 이번에는 단적으로 심플하게 핵심코드만 보기로 하자.


System.out.println("문자 한줄을 입력하고 엔터를 누르시오.");
String s=br.readLine();
System.out.println("입력한 문자열은 "+s+"입니다.");

키보드 입력받아서 컴퓨터가 처리하고 모니터에 출력한다. 이 세가지 과정으로 압축된다. 즉, 여러분이 어떤 문자열을 입력했을때 readLine() 메소드로 읽어드린후


InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);

아까 위에서 설명한 것처럼 버퍼와 스트림을 통해 읽어들이는 것이다. 재탕(?)하자면, 키보드에서 readLine() 메소드로 읽어들인 문자열을 System.in객체에서 하나하나 스트림(isr)을 통해 연속적으로 보내진 데이터를 버퍼(br)에서 읽고 화면으로 그 데이터(s)들을 출력한다. 지금 위의 두 라인은 new가 있으므로 알다시피 입력값을 이용해 각 클래스의 객체를 생성하고 있는 과정이다. 이런 과정을 통해 얻어진 최종 버퍼값(br)으로 화면에 겨우겨우(?) 데이터(s)를 출력하게 만드는 것이다.

우리는 프로그래밍을 배우고 있다. 따라서 똑같은 정답은 없다. 여러분의 생각에 따라 결과는 같더라도 과정은 달라질수 있다. 이게 프로그래밍을 배우는 묘미라면 묘미일수 있겠다. 오늘 버퍼와 스트림을 이용한 입출력 방법을 간단하게나마 알아보았다. 다음 시간에는 입출력의 마술사 Scanner 클래스와 만나는 시간을 통해 그 진한 감동의 묘미(?)를 느껴보시기 바란다. ^^

댓글 3개: