(2) 알아두면 유용한 클래스2

[Study]

출처 : http://www.freejava.wo.to/ 저작자 : (프리맨)

(2)
알아두면 유용한 클래스2
-StringTokenizer Class-

지난 시간의 String 클래스를 많이 연습해 봤는지 모르겠습니다. --; 특히 API를 살펴보고 메소드와 그 기능들을 직접 찾아보는 방법은 지난 강좌를 통해서 이젠 많이 익숙해졌다라고 생각하겠습니다. (조금씩 모자라다고 생각하시는분들은 복습을 통해 더욱 열심히 정진하시길 바라겠습니다.^^)

그러면 이번 강좌도 알아두면 유용한 클래스의 두번째 시간으로 새로운 클래스의 바다에 퐁당 빠져보겠습니다.

- StringTokenizer Class


~~~ 이름이 이상하리만큼 긴 클래스입니다. -,.-
이 클래스는 java.util 패키지 안에 들어있는 클래스로서 java.util 패키지에는 여러가지 유용한 클래스들이 듬뿍 담겨져 있는 유용한 패키지 입니다. 간단히 살펴보면 날짜표시를 쓸수 있는 Calendar 클래스 라던가 난수를 발생하는 Random 클래스, 자료 입력과 출력이 용이로운 Vector클래스등 활용해서 쓸수 있는 많은 유용한 클래스가 있습니다. 그중에서 지금 우리가 볼 StringTokenizer라는 클래스는 String 문자열을 토큰(조각) 단위로 나누어주는 기능을 하는 클래스입니다. (메소드도 아닌것이?) ....마치 메소드 같다구요.

String 클래스의 메소드인것 같은 착각이 들 정도의 역활을 하는 것 같지 않습니까? 허나 StringTokenizer분명 클래스입니다. 이점 잊지 마시길 바라며 클래스이니 바로 생성자 부터 살펴보도록 하죠....^^


StringTokenizer
클래스는 모두 세개의 생성자를 가지고 있습니다.

StringTokenizer(String str)

         Constructs a string tokenizer for the specified string.

       

StringTokenizer(String str, String delim)

         Constructs a string tokenizer for the specified string.

        

StringTokenizer(String str, String delim, boolean returnTokens)

         Constructs a string tokenizer for the specified string.

       













생성자가 3개나 되어서 클래스를 만드는 것이 어려워 보일지도 모르겠지만 걱정마십시요. 제가 누굽니까...하하..^^;
클래스를 사용하기 위해서는 new 명령을 이용하여 객체의 인스턴스를 만들어야 합니다. 그런데 이 클래스는 생성자가 3개나 있고 또한 각각 마다 주어야 할 인자가 다 틀리기 때문에 작업에 필요한 클래스를 잘 생성해야 할 지혜가 필요할 것입니다.


StringTokenizer(String str)
첫번째 생성자는 기본적인 분리자( '\n', '\r', '\t')로 문자열을 분리해 냅니다.

StringTokenizer(String str, String delim)

두번째 생성자는 분리자를 프로그래머가 원하는대로 집어 넣을 수 있고 그 분리자로 문자열을 분리해 냅니다.

StringTokenizer(String str, String delim, boolean returnTokens)
세번째 생성자는 두번째 생성자와 같은 기능을 하며 추가적으로 분리자가 포함될지 여부를 따로 정해줍니다
.
에궁...그냥 생성자만 보아서는 무슨 소리인지 모르겠다고요. -,.-;
그럼 소스를 한번 살펴보면서 StringTokenizer 클래스가 어떤 역활을 하는지에 대하여 알아보겠습니다.

import java.util.*;

public class StringTokenizerTest

{

  String birth;

  public StringTokenizerTest(String text)

  {

        this.birth = text;

        }

 

  public void seperate(String birth, String division)

  {

     StringTokenizer st = new StringTokenizer(birth, division);

     while(st.hasMoreTokens())

     {

       System.out.println(st.nextToken());

       }

  }

 

  public static void main(String[] args)

  {

     String birth = "79-03-27";

     StringTokenizerTest stt = new StringTokenizerTest(birth);

     String division = "-";

     stt.seperate(birth, division);

  }

}
































이제 님의 실력도 어느 정도 상승되었을 테니 StringTokenizer라는 클래스가 어떤 역활을 하는지 유추해 보십시요.
(미리 설명드렸던 것은 잊어버리구요. 안되더라도 한번 해보시기 바랍니다. 그게 바로 실력이 느는 길이니까요.^^)
~ StringTokenizer 클래스에 인자로 준 입력값이 String형 문자열인 "79-03-27", "-" 이고 그것을 사용한 출력값이(실행해 보세요!) "79,03,27"이 라인이 구분되어서 출력 되었습니다. 우선 딱 보면 "79-03-27" 에서 '-' 이 없어졌지요. (어라 누가 잡아먹었나? 썰렁해서 죄송합니다.--;)
! 이제부터 고민입니다.(-,.-) while문은 반복문이고 그 안에 출력문이 들어 있습니다. 그것두 System.out.println() 구문은 출력을 하고 한줄을 넘기는 성질이 있는 놈(?)이니까, 생각해 보면 출력에서 "79,03,27"의 라인이 구분된 것은 System.out.println() 의 탓이고 결국 StringTokenizer 클래스는 "79-03-27", "-" 라는 두개의 String형 문자열을 인자로 받아 "79,03,27"을 출력해 주니까. (이제 어느정도 감이 잡히십니까?^^)
네 그렇죠!! 우리가 유추할 수 있는 결론은 '인자 두 개를 사용하는 생성자로 만들수 있는 StringTokenizer 클래스는 앞에 들어 있는 인자의 문자열을 뒤의 인자의 문자열(구분자)로 분리한다' 입니다헤헤~~~ ^^ 여기까지 잘 따라오셨다면 님은 아주 훌륭한 유추를 하신것입니다. 축하드립니다... 그럼 이제부터는 진짜로 StringTokenizer 클래스가 어떤 기능을 할 수 있는 클래스인지 알아 볼까요? 님이 유추하신대로 StringTokenizer 클래스는 구분자를 통해서 문자열을 분리해주는 역활을 하는 클래스입니다.
StringTokenizer st = new StringTokenizer(String 문자열,String 구분자); 이런 식으로 프로그램 소스안에는 객체의 인스턴스를 생성해서 사용하기위해 인자가 두개 들어갑니다. 그리고 자체적으로 문자열을 구분자에 의해 분리한 후에 st객체에 배열로 집어 넣었습니다. 우리는 그 st객체 배열을 끄집어 내서 사용하는 것으로 문자열을 나누는 효과나 문자열중의 단어들을 구별하는 효과를 얻을 수 있습니다. 지금 소스에서 사용중인 메소드는 hasMoreTokens() nextToken() 메소드가 있는데  이들은 StringTokenizer 클래스에서 가장 많이 사용되는 메소드로 hasMoreTokens() 메소드는 자료가 있는지 없는지 검사해서 boolean형으로 유,무를 반환합니다. 그리고 nextToken() 메소드는 StringTokenizer 클래스로 생성한 인스턴스 배열에서 값을 하나 추출합니다. 이것은 배열과는 조금 다른 부분이 있는데 StringTokenizer 클래스로 생성한 인스턴스 배열에서 자료값을 한번 빼내면 그것은 삭제조치 된다는 거죠. (완전히 뽑아내는 개념입니다. 즉 저장되는 자료가 아니죠.^^) 이외에도 hasMoreTokens() nextToken()메소드와 같은 기능을 하는 hasMoreElements() nextElement()메소드 그리고 분리된 토큰(배열)의 개수를 세어서 int형 값으로 리턴해주는 countTokens()메소드가 있습니다. 여기서 논하지 않은 메소드들도 있는데 그것은 직접 API에서 확인후, 소스도 작성해 보시고 하면서 익혀두시기 바라겠습니다. 그런데 한가지 궁금증이 생겼습니다. (맨날 생겨요 궁금증...--;) 왜 같은 메소드가 두개나 있냐는 거죠.hasMoreTokens() hasMoreElements()라는 두개의 메소드는 서로 같은 기능을 하면서 (API 메소드 설명에서도 hasMoreElements() hasMoreTokens()메소드와 같은 기능을 한다고 명시되어 있습니다.) 불필요하게 왜 두개가 있어야 하는거죠그 이유는 StringTokenizer 클래스의 구조를 천천히 살펴보면 되는데 토큰을 배열같은 저장 장소에 집어 넣고 원하는 데이터를 빼내고 확인하기 위하여 StringTokenizer 클래스가 Enumeration 인터페이스를 구현했기 때문입니다.Enumeration 인터페이스는 hasMoreElements() nextElement() 메소드가 abstract 선언자로 선언만 되어지고 구현부분이 없는 인터페이스(추상화 클래스)입니다. 이 인터페이스는 보통 나열된 개체중에서 원하는 것을 뽑아내거나 자료가 있는지 없는지의 유무를 확인하는 등의 작업을 하는 인터페이스 입니다. 이제 왜 두개가 있는지 좀 유추가 되셨나요? 결론을 내리자면 StringTokenizer 클래스는 이런 Enumeration 인터페이스를 구현했기 때문에 지금 우리가 소스에서 본 것같은 작업을 할 수 있게되는 것이고 그래서 hasMoreElements() nextElement()메소드를 구현한 것입니다. 음 여기까지가 StringTokenizer에 대한 약소하지만 저의 설명이었습니다. 쿠콰콰콰콰^^

StringTokenizer는 문자열을 분리해주는 기능을 가지고 있기때문에 추후 입력받은 값을 프로그래머가 원한 값으로 추출및 수정할때 탁월한 효과를 불러오기 때문에 사용법을 꼭 이해해두시기 바라겠습니다.

그럼 이번 강좌는 이걸로 끝~~~~~~~~~

2006/12/13 14:38 2006/12/13 14:38
TAG.

이 글의 트랙백 주소 :: http://geuni.net/blog/trackback/48

::: 사람과 사람의 교감! 人터넷의 첫 시작! 댓글을 달아주세요! :::