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

[Study]

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

-HashTable Class-

지난 강좌에 배웠던 Vector 클래스는 어떻게 좀 이해가 되시나요? ^^ 메소드를 응용한 프로그램들을 많이 만들다 보면 그냥 책을 읽는 것보다는 훨씬 더 이해가 빠를것입니다. 그러니 여러가지 예제소스를 직접 만들어서 실행해 보세요.

에러가 난다고 두려워 마시고 그 에러를 많이 내고 또한 많이 잡아야지 실력이 향상되는 것입니다.
그러니 열심히 하시기를 다시 한번 기원해보며 이번 강좌를 진행하겠습니다.


- Hashtable Class

이번 강좌에서 배우게될 유용한 클래스는 Hashtable 클래스 입니다. 이 클래스는 지난 강좌에서 보았던 Vector마찬가지로 데이터를 저장할수 있는 클래스 입니다. , 조금 다른 점이 하나 있는데 Vector 저장 객체 같은 경우는 데이터만 저장하는 거고 Hashtable 클래스는 데이터만 저장하기 보다는 보통 keykey에 따른 value값을 저장할수 있습니다. 무슨 말인고 하니 자료를 쌍으로 받는다는 거죠. 좀 더 자세히 설명드리자면 "test" 라는 String형 데이터가 있다고 치면 Vector 저장 객체는 단지 "test"라는 것만 저장을 시키는데 반해 Hashtable 클래스는 "test" 라는 것과 또 다른 값을 동시에 집어 넣을 수 있습니다.

"test" key 값이 되면 그에 따른 또 다른 value값을 넣어 줄 수 있고
"test" value 값이 되면 그에 따른 또 다른 key값을 넣어 줄 수 있는 것입니다.

그런데 이게 무슨 장점이 있을까요? 하하 장점이 벌써 뭔지 아시겠다고요. ~ 모르는 사람들을 위해서 조용히 하시길...^^

예 그겁니다. Hashtable key key에 따른 value값을 집어 넣을 수 있기 때문에 key 값으로 내가 원하는 데이터를 추출해 낼수 있는 것이죠. 한마디로 key를 이름으로 생각하면 이름만 알면 내가 집어 넣은 값을 손쉽게 얻어 낼 수 있다는 것입니다. 손쉽게 데이터에 이름표를 붙였다고 생각하십시요. (자료에 이름표를 달자~~)


이것은 보통 자주쓰는 String형이나 기본타입의 자료형에는 그리 유용해 보이지 않을지 모르지만 만약, 우리가
자바의 특성에 따라 클래스나 객체를 자료형으로 삼아 데이터를 넣었을 경우에는 아주 유용하게 사용할 수 있습니다.

한번 생각해 보세요. 만약 Vector 저장 객체를 Hashtable 클래스에 넣게 된다면(당근 key를 주겠죠.)어떤식으로 이용되는지 조금은 머리속에 떠오르시나요 그럼 좀 더 자세한 것을 알아보겠습니다. Hashtable 클래스를 인스턴스화 할때 사용되는 생성자는 모두 4가지가 있지만 그중 자주 사용되는 것은 2가지 입니다.

Hashtable()

Constructs a new, empty hashtable with a default capacity and load factor, which is 0.75.

(기본 용량 및 로드 인자를 가진 빈 신규 해시테이블을 구성합니다.)

Hashtable(int initialCapacity)

Constructs a new, empty hashtable with the specified initial capacity and

default load factor, which is 0.75.

(지정된 초기 용량에 기본 로드 인자를 가진 빈 신규 해시테이블을 구성합니다. )

그냥 기본값으로 HashTable 클래스를 생성하는 생성자가 하나 있고 int 형으로 초기능력치(initialCapacity)인자로 받아 HashTable 클래스를 생성하는 생성자가 있습니다. 이것외에도 2개의 생성자가 더 있지만 자주 사용되지 않고 또한 초보에게는 지금 본 2개만으로 충분하기에 다루지 않겠습니다. (그래도 API를 보고 있는지는 확인해봐야겠죠.)

이렇듯 생성자를 이용 Hashtable 클래스의 인스턴스를 생성하고 난후 이제부터 알아볼것은 사용되어질 메소드입니다.

void

clear()
           Clears this hashtable so that it contains no keys.
           (
키가 들어있지 않도록 해시테이블을 지웁니다.)

boolean

containsKey(Object key)
           Tests if the specified object is a key in this hashtable.
           (
지정된 객체가 해시테이블에 있는 키인 지를 테스트합니다.)

boolean

containsValue(Object value)
           Returns true if this Hashtable maps one or more keys to this value.
           (
지정된 객체가 해시테이블에 있는 값인 지를 테스트합니다.)

Enumeration

elements()
           Returns an enumeration of the values in this hashtable.
           (
해시테이블에서의 열거(enumeration) 리턴합니다.)

Object

get(Object key)
           Returns the value to which the specified key is mapped in this hashtable.
           (
해시테이블에서 지정된 키가 맵핑된 값을 리턴합니다.)

Object

put(Object key, Object value)
           Maps the specified key to the specified value in this hashtable.
           (
지정된 키를 해시테이블에서 지정된 값으로 맵핑합니다.)

Object

remove(Object key)
           Removes the key (and its corresponding value) from this hashtable.
           (
해시테이블에서 ( 해당 ) 제거합니다.)

int

size()
           Returns the number of keys in this hashtable.
           (해시테이블에 있는 키 갯수를 리턴합니다.)





























.... 메소드가 생각보다 없군요. 지금 보시는 메소드들이 Hashtable 클래스를 사용할때 사용되어질 메소드들 입니다.
본래의 API에는 이것보다 훨씬 더 많은 메소드가 있지만 주로 사용되는 메소드와 반드시 알아야할 메소드만 추린겁니다. (이해하시길....^^ 나머지 메소드는 API를 보고 직접 참고하세요. 그것도 실력 향상의 지름길입니다.) 메소드의 설명을 보시고 쉽게 이해가 가지 않으신가요? Vector편의 강좌를 잘들으신 분들은 아마 쉽게 이해할실겁니다. Vector 클래스의 메소드와도 비슷한 메소드가 많이 있죠.

우선 clear()란 메소드는 단어뜻 그대로 '깨끗이' 만드는 메소드입니다. 이것은 결국 remove() 메소드랑 같은 뜻이죠. 바로 Hashtable 클래스에 저장되어 있는 자료를 지우는 행동을 합니다. 이 두 메소드의 차이점은 clear() Hashtable 클래스에 저장되어 있는 모든 자료를 깨끗이 만드는 거고,remove() 메소드는 Object key 값을 받아서 Hashtable 클래스에 저장되어 있는 자료 중에 key값이 같은것이 있나 찾아보고 있을경우 key값이 같은 것만 지우는 행동을 합니다. 즉 일반 삭제와 완전 삭제의 차이죠.

그 다음에 볼 메소드가 containsKey() 메소드입니다. containsKey() 메소드는 Object형으로 key값을 인자로 받아 Hashtable 클래스에 저장되어 있는 key값 중에 인자로 들어온 값이 있나 없나 확인하는 메소드 입니다.당근 containsValue() 메소드는 설명안해도 어떤 메소드인지 아시겠죠.

이제 직접적으로 자료 입,출력에 관계된 메소드를 살펴보면 put() 이라는 메소드가 있습니다. 이 메소드는 Hashtable 클래스에 자료를 저장하는데 key key에 따른 value값 두 값을 동시에 저장 합니다.

그리고 get() 이라는 메소드는 key값을 인자로 받아 위에서 처럼 저장된 자료중에서 key값이 동일한 값의 value값을 Object형으로 리턴해줍니다.이 두개의 put(), get() 메소드가 기본적으로 Hashtable의 자료 입,출력에 관계된 메소드로서 기본적인것 만큼 가장 자주 쓰이는 메소드이니 Hashtable 클래스와 함께 생각해 두시기 바랍니다.마지막으로 size()라는 메소드는 설명안해도 바로 짐작하실테지만 Hashtable 클래스에 얼마나 많은 자료가 저장되어있는가 , 크기를 int형 값으로 반환해주는 메소드입니다.

후후... 제가 제시했던 메소드에 관한 대략적인 설명은 다 보셨습니다. 그리 어렵지 않죠.^^

그럼 소스를 보면서 정확히 어떤식으로 쓰이고 어느때 쓸 수 있는 메소드인가를 님들 스스로 유추해 보시기 바랍니다.

import java.util.*;

public class HashtableTest

{

  Hashtable hash;

  public HashtableTest()

  {

        hash = new Hashtable();

        }

 

  public void inputData(String text[])

  {

     for (int i=0 ; i < text.length ; i++)

     {

       hash.put(""+i,text[i]);

       }

    }

 

  public void printData()

  {

     System.out.println("size() -> " + hash.size());

     HashtableEnumeration(hash);

     System.out.println("get(\"0\") -> " + hash.get("0"));

     System.out.println("remove(\"0\") -> " + hash.remove("0"));

     System.out.println("get(\"0\") -> " + hash.get("0"));

     System.out.println("containsKey(\"2\") -> " + hash.containsKey("2"));

     System.out.println("containsValue(\"test1\") -> " + hash.containsValue("test1"));

     hash.clear();

     System.out.println("clear() and get(1) -> " + hash.get("1"));

    

    }

  public void HashtableEnumeration(Hashtable has)

  {

    Enumeration enu = has.elements();

     while(enu.hasMoreElements() )

     {

        System.out.println("Enumeration -> " + enu.nextElement());

       }

     }

  public static void main(String[] args)

  {

     String[] text = {"test1", "test2", "test3", "test4", "test5"};

     HashtableTest ht = new HashtableTest();

     ht.inputData(text);

     ht.printData();

    

  }

}

size() -> 5

Enumeration -> test5

Enumeration -> test4

Enumeration -> test3

Enumeration -> test2

Enumeration -> test1

get("0") -> test1

remove("0") -> test1

get("0") -> null

containsKey("2") -> true

containsValue("test1") ->false

clear() and get(1) ->null






























































어때요 별로 어렵지 않죠. 제가 이전에 설명드린 메소드의 설명과 소스를 통한 결과를 한번 비교해 보면서 소스를 해석해 보시기 바라겠습니다. 좀 특별한 것은 hash.put(""+i,text[i]);

이 부분인데 ""+i 라고 써준 부분은 int형인 i 값을 String형으로 변환해주기 위해서 입니다.

본래 put()이라는 메소드는 Object형의 데이터를 인자로 받습니다. 그런데 문제는 String형은 자동으로 Object로 형변환이 되는데 int형은 Object형으로 변환되지 않는다는 것 입니다. 그러기 때문에 페인팅을 쓴거죠.(속임수? ^^)

""+i 라는 구문은 스트링형 빈칸에다가 int i값을 추가해 준건데 자바에서는 이때 자동으로 String형으로 형변환을 해줍니다. 즉 아무것도 없는 "" 에다가 i를 추가해 준다는 것은 int i String형으로 자동 형변환 해주는 효과를 얻을 수 있습니다. 그런후에 put() 메소드에 인자로 넣어주는 거죠....^^ 이해가 좀 되시나요?

이렇듯 메소드의 인자의 형은 아주 중요합니다. 세세하게 API를 보시는 눈을 가지시길 바라겠습니다. @,.@

하하....여기까지가 Hashtable 클래스에 관한 짧은 설명이었습니다. 설명은 짧지만 Hahtable은 사용빈도가 상당히 많은

클래스 입니다. Vector와 함께 자주 쓰이며 프로그래밍 할때 상당히 사용이 편리합니다. 그러니 제가 올려드린 메소드이외에 API를 보면서 더 많은 것을 보시기 바라겠습니다. ^^ 에궁...힘들게 또 한강좌가 끝났습니다....

이번 강좌도 끝!!!! 파이팅!!!!

2006/12/13 16:37 2006/12/13 16:37
TAG.

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

[Study]

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

-Vector Class-

지난 강좌의 StringTokenizer 클래스는 연습을 통해 확실하게 사용할 수 있게 되었나요 (아니라구요...--;) 이번 강좌는 Enumeration 인터페이스를 구현한 Vector 저장객체에 대해서 알아 보려고 합니다.이번에 배우게 될 Vector 저장객체는 가장 많이 쓰이는 클래스중 하나이기 때문에 세심히 봐두시기 바랍니다. 그럼 이번 강좌도 시작해볼까요.....^^


- Vector Class

지난 강좌에 Enumeration 인터페이스 얘기가 나왔으니까 데이터를 저장할수 있는 저장 객체에 대해 좀 더 얘기해 보는 시간을 갖도록 하죠. 그래서 이번에 보실것이 Vector라는 객체입니다. Vector라는 객체는 크기가 가변적인 저장객체입니다. 좀 더 자세히 설명하자면 Vector는 클래스이긴 하지만 저장객체로 사용되고 Object형까지 전부 다 집어 넣을 수 있는데(모든 클래스가 java.lang.Object를 상속하므로 모든 클래스를 다 집어 넣을수 있습니다. ^^ 다 넣어라..) 그 크기가 고정된 것이 아니라 일정 정도의 양이 차면 알아서 여유 공간을 늘려주므로서 크기가 변하는 저장 객체 입니다.

쉽게 생각해서 물을 넣을 수 있는 풍선이라고 생각하시면 됩니다. 물이 저장하려는 데이터고 풍선이 Vector객체인거죠.

처음에 풍선은 아주 작지만 물이 계속 들어오면 들어올수로 풍선도 점점 커지죠 그리고 불행한 얘기이기는 하지만 저장 용량의 한계를 넘어 버리면 '~!', ~~~~~~ 쉽게 이해가 되시겠죠....

(하지만 그리 쉽게 Vector 객체가 터지지는 않습니다. 왜냐하면 메모리랑 연관이 있기 때문이죠. ^^)

보통 객체를 생성할 때는 Vector vector = new Vector();

이런 구문처럼 아무 인자도 주지 않고 생성하는데 만약 초기 저장 용량과 용량이 더 필요할때마다 늘어날 용량을 정해줄 필요가 있다면 인자로 넣어주고 Vector vector = new Vector(10, 15); Vector 객체를 생성할 수도 있습니다.

Vector 객체의 특징은 이외에도 elements()메소드를 이용하여 Enumeration의 인스턴스를 반환하기 때문에 Enumeration을 객체로 이용할 수도 있습니다. (원하면 Enumeration의 인스턴스의 메소드들도 사용할 수 있다는 말입니다.) 그리고 Vector 클래스는 데이터를 저장하거나 빼내기 위해 정말 많은 메소드들을 제공해 줍니다. 그것을 살펴보면

void

add(int index, Object element)
           Inserts the specified element at the specified position in this Vector.
           (벡터의
index 지정된 컴포넌트를 추가합니다.)

void

addElement(Object obj)
           Adds the specified component to the end of this vector, increasing its size by one.
           (벡터
끝에 지정된 컴포넌트를 추가하며, 크기는 1단위로 증가합니다.)

int

capacity()
           Returns the current capacity of this vector.
           (벡터의
현재 용량을 리턴합니다.)

void

clear()
           Removes all of the elements from this Vector.
           (백터의
모든 컴포넌트를 제거합니다.)

Object

clone()
           Returns a clone of this vector.
           (벡터의
복제를 리턴합니다.)

boolean

contains(Object elem)
           Tests if the specified object is a component in this vector.
           (지정된
객체가 벡터의 컴포넌트인지 테스트합니다.)

Object

elementAt(int index)
           Returns the component at the specified index.
           (지정된
index 있는 컴포넌트를 리턴합니다.)

Enumeration

elements()
           Returns an enumeration of the components of this vector.
           (벡터
컴포넌트의 열거(eumeration) 리턴합니다.)

Object

firstElement()
           Returns the first component (the item at index 0) of this vector.
           (벡터의
첫번째(index 0) 컴포넌트를 리턴합니다.)

Object

lastElement()
           Returns the last component of the vector.
           (벡터의
마지막 컴포넌트를 리턴합니다.)

Object

remove(int index)
           Removes the element at the specified position in this Vector.
           (백터의
지정된 index 있는 컴포넌트를 삭제합니다.)

boolean

remove(Object o)
           Removes the first occurrence of the specified element in this Vector If the Vector does not contain the element, it is unchanged.
           (벡터에서
인수의 첫번째 발생을 제거합니다. 만약, 벡터에 아무 컨테이너도 없으면 아무런 변화도 일어나지 않습니다.)

void

setElementAt(Object obj, int index)
           Sets the component at the specified index of this vector to be the specified object.
           (벡터
지정된 index 있는 컴포넌트를 지정된 객체로 설정합니다.)

List

subList(int fromIndex, int toIndex)
           Returns a view of the portion of this List between fromIndex, inclusive, and toIndex, exclusive.
           (fromIndex에서
toIndex까지의 위치의 컴포넌트 List 반환합니다.)






















































메소드가 너무 많아요..T.T 정말로 엄청나게 많은 메소드인 것 같지만 이거 새발의 피입니다. --;
Vector 클래스에 있는 메소드중에 중요한 것만 추린것이거든요. 메소드가 많다는 것은 그만큼 기능이 많다는 것. 이제부터 Vector 클래스에 있는 메소드들의 기능을 알아볼까요.

import java.util.*;

public class VectorTest

{

  Vector vector;

  public VectorTest()

  {

        vector = new Vector();

}

 

  public void inputData(String text[])

  {

     for (int i=0 ; i < text.length ; i++)

     {

       vector.addElement(text[i]);

       }

    }

 

  public void printData()

  {

     System.out.println("capacity() -> " + vector.capacity());

     String text  = "test2";

     System.out.println("contains(text) -> " + vector.contains(text));

     System.out.println("elementAt(3) -> " + vector.elementAt(3));

     vectorEnumeration(vector);

     System.out.println("firstElement() -> " + vector.firstElement());

     System.out.println("lastElement() -> " + vector.lastElement());

     System.out.println("remove(3) -> " + vector.remove(3));

     System.out.println("|_elementAt(3) -> " + vector.elementAt(3));

     String text2 = "text";

     vector.setElementAt(text2,1);

     System.out.println("setElementAt(text2, 1) and elementAt(1)-> " + vector.elementAt(1));

    }

  public void vectorEnumeration(Vector vec)

  {

    Enumeration enu = vec.elements();

     while(enu.hasMoreElements() )

     {

        System.out.println("Enumeration -> " + enu.nextElement());

       }

     }

  public static void main(String[] args)

  {

     String[] text = {"test1", "test2", "test3", "test4", "test5"};

     VectorTest vt = new VectorTest();

     vt.inputData(text);

     vt.printData();  

  }

}




















































음 소스를 보시고 뭔가 팍! 느낌이 오시는것들이 있으시지 않으신가요. 아마 제가 따로 메소드를 설명하지 않더래도
벌써부터 메소드의 기능을 API와 예제 프로그램 소스만으로 이해하신분들도 있으시겠죠. (앞으로 계속 이런식으로 설명을 드릴텐데 초보의 경지에 이렀다는 것은 지금 했던 것처럼 API와 소스만으로도 클래스와 메소드가 어떠한 기능들을 하는지 알게되는 것입니다. 그렇게 되면 기타 다른 책을 봐도 머리속에 팍팍 이해가 되겠죠. 초보의 그 경지를 위하여 열심히 정진하시기를....^^)

잡생각은 이제 그만하고 Vector 클래스의 메소드에 대해 간략하게 설명드리겠습니다. (먼저 예제 프로그램을 꼭 돌려보시기를) Vector는 저장 객체라고 하였습니다. Vector의 가장 기본적인 것은 addElement() 메소드를 이용하여 Vector에 데이터를 집어넣고 elementAt() 메소드나 firstElement(), lastElement() 메소드를 이용해 저장되어 있는 데이터를 빼내는 것입니다.

elementAt() 메소드는 int형으로 index를 받아서 Vector 저장 객체안에 저장되어 있던 데이터의 index(순서)일치되는 것을 Object형으로 반환하여 줍니다. 그리고 firstElement()는 제일 처음에 저장되어 있는 데이터를, lastElement()는 마지막에 저장되어 있는 데이터를 반환하여 줍니다.

그런데 만약 님이 데이터를 Vector에다가 저장시켰는데 필요 없다거나 지워야 할때가 있지 않습니까?

그럴때 사용되는게 remove() 메소드로서 index나 저장되어 있는 데이터를 인자로 받아 Vector 저장 객체안의 데이터를 지울수 있습니다. clear() Vector 저장 객체안의 데이터를 지울수 있는데 이 메소드는 remove() 처럼 한개의 데이터를 지우는 것이 아니라 Vector 저장 객체안의 모든 데이터를 지우는 메소드입니다.

또한 Vector 저장 객체 안의 데이터를 수정해야할때는 setElementAt() 메소드를 이용해서 인자로 바꾸어줄 데이터와 index 위치를 넣어주시면 님이 원하는 대로 수정을 하실수 있습니다.Vector 저장 객체의 상태를 알아볼수 있는 메소드도 있는데 capacity() 메소드는 Vector 저장 객체의 저장 능력을 반환 합니다. 예제 소스를 실행 시켰을때 5개의 데이터를 집어 넣었는데 메소드의 결과가 10이라서 이해가 안되신 분들도 있을텐데 Vector는 가변적인 저장 객체 이지만 처음 초기값을(기본은 10) 주고 그 이상의 데이터가 들어올 경우에만 자동적으로 저장 능력을 늘려줍니다. 그렇기 때문에 capacity() 메소드의 결과가 10이 나온것 입니다.

그리고 많이 사용되는 containts() 메소드가 있는데 이것은 인자로 받은 Object형 데이터가 Vector 저장 객체 안에 저장되어 있는지 확인하고 그 결과를 boolean형으로 반환하는 메소드입니다.

이런 메소드는 데이터의 유,무를 확인할때 많이 사용되죠. 그 다음으로 메소드중에 clone()이라는 메소드에 대해서 설명드리겠습니다. 이것은 java.lang.Object 안에 있는 메소드였는데 여기서 다시 재정의 한거죠. (결국 다른 클래스에서도 clone()을 쓸수 있다는 말입니다. 왜인지는 아시겠죠.^^)

clone()메소드는 단어뜻 그대로 복제를 만들어 내는 메소드입니다. 원본 객체를 복사한 동일한 객체를 만드는 거죠. ... 왜 이런걸 만들어 쓸까요? 헤헤^^ 보통 이 메소드는 원본 객체의 보호를 위해 많이 쓰입니다. 보호라니까 말이 조금 이상한데 객체를 변경하거나 다른 용도로 사용하는데 원본 객체 즉, 원래 상태를 유지하고 있는 것이 필요할 경우에 변경사항이 있을 경우 clone() 메소드를 이용 복제품을 하나 만들어서 사용합니다.

그리고 마지막으로 제가 설명드릴 메소드는 elements()라는 메소드입니다. 이것 또한 조금 특이한 메소드인데 Enumeration 객체의 인스턴스를 반환합니다. 그러기 때문에 Enumeration Vector 저장 객체를 연결(?)할때 많이 사용됩니다.

... 연결이라고 둘을 붙인다는것이 아니라 Vector 저장 객체로 Enumeration의 메소드를 사용하기 위하여 많이 사용됩니다.예제 소스를 보시면 어떤식으로 해야 되는지 단번에 알수 있을 겁니다.

그리고 데이터가 필요할 경우는 Enumeration hasMoreElements() nextElement()등의 메소드를 이용하여 Vector에 저장되어 있는 데이터를 꺼내어 사용합니다. 여기까지가 Vector 클래스에서 가장 많이 쓰이는 메소드들에 대한 간략한 설명이었습니다. 제가 설명드린것 말고도 Vector 클래스는 많은 메소드를 가지고 있는데 그것들은 님이 API에서 찾아 보시고 여지껏 설명드린것과 같은 방법으로 직접 알아보시기 바라겠습니다. 에궁 또 힘들게 한강좌를 끝냈네요... 강좌를 한 강좌, 한 강좌,진행할때마다 조금씩 더 어려워지고 막중한 책임감이 느껴집니다. 그래도 열심히 해야겠죠. ^^ 비록 미숙한 실력이지만 많은 시작하는 분들이 제 강좌를 보고 아주 조금만이라도 자바에 가까워지면 저는 그것으로 만족입니다. 그리고 그것을 위해 다음강좌도 열심히 해야겠죠.^^ 그럼 다음 강좌로....!!!!

2006/12/13 15:37 2006/12/13 15:37
TAG.

(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.

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

[Study]

출처 : http://www.freejava.wo.to/

(1)
알아두면 유용한 클래스
-String Class-

에궁 자바의 기초를 잡는다고 너무나 험난한 시간을 보내 왔습니다. 하지만 자바는 이제부터 시작입니다. 지금까지 배운 기초지식을 이용해서 어떤 식으로 자바를 이용할 수 있고 API를 통해서 새로운 클래스를 배우는 방법등에 대한 많은 것을 배울 것입니다. 그러니... 준비 단단히 하시기 바랍니다. ^^

그럼 이제부터 알아두면 언제든지 써먹을 수 있고 또한 자주 쓰이는 클래스들에 대해 차근차근 짚어보는 시간을 가져보도록 하겠습니다. 그럼 스타트.....!!!


- String Class

String 클래스는 자료형에서 이미 보셨을 테지만(다 알지유.^^) 문자열을 표현하기 위해 자바에서 제공해주는 클래스입니다. 실질적으로 프로그램을 작성하다보면 char형 문자 '1'자나 int형 정수 보다는 String형 문자열을 가장 많이 사용하게 되고 또한 그에 따른 많은 기능들을 필요로 하게 됩니다. 그렇기 때문에 자바의 String 클래스는 이런 사용자들의 요구에 걸맞은 다양한 기능들을 포함하고 있습니다.하지만 대부분의 사람들이 자료형 클래스라는 이유로 대충 넘어가고 주의를 하지 않는 경우가 종종 있습니다만 String 클래스는 필요한 만큼 정말로 많은 기능이 있고 또한, 그 기능들을 잘 사용하면 문자열 표현의 많은 부분을 훨씬 편하게 할 수 있습니다. 그렇기 때문에 이런 String 클래스를 자유자재로 다루기 위해서 String 클래스를 API를 통해 직접 보면서 여러가지 메소드들의 기능과 사용법들에 대해 설명드리겠습니다. 우선, 클래스이니까 생성자를 통해 인스턴스를 생성해야지만 객체를 사용할 수 있습니다. String 클래스는 생각외로 많은 생성자를 가지고 있고 또한 각 생성자는 여러가지 인자에 따라 그에 맞는 String 객체를 생성하게 됩니다. 하지만 저희가 그것까지 전부다 볼 필요는 없습니다. (허나 아예 무시하고 잊어버리시면 안됩니다.--; 참고하십시요.) 왜냐하면 String 클래스는 자료형에도 쓰이기 때문에 String text = "야 이것은 테스트이다."; 라고 단순하게 문장을 써도 (여태껏 저희가 봐왔던 new를 이용한 인스턴스 생성및 객체 이용법 하고는 다르지만)String 클래스를 이용하실 수 있습니다. 그리고 지금으로서는 이것만으로 충분합니다. (분수 배우기...^^) , String 변수에 값을 입력하는것은 String 변수에 값을 입력하는 것이 아니라 그 값이 있는 주소를 입력시켜서 사용하는 거라는 것 기억하고 계시죠? (레퍼런스(reference) 라는것...기억해 두세요. ^^) 그럼 이제부터 실질적으로 String 클래스 API를 보면서 메소드에 대하여 한가지씩 알아 보겠습니다.

charAt

public char charAt(int index)

Returns the character at the specified index. An index ranges from 0 to length() - 1. The first character of the sequence is at index 0, the next at index 1, and so on, as for array indexing.  

Parameters:

index - the index of the character.

Returns:

the character at the specified index of this string. The first character is at index 0.

Throws:

IndexOutOfBoundsException - if the index argument is negative or not less than the length of this string.

















charAt() 메소드는 int형 변수를 인자로 받아서 연산작업후 char형으로 결과를 리턴해주는 메소드입니다. 좀더 자세하게 설명하자면 charAt() 메소드는 인자로 받은 문자열의 int형 변수 index로 문자열의 index번째의 문자를 추출해서 반환해주는 행동을 해줍니다. 예를 들어 "Take It East." 라는 문자열이 있을 경우 charAt(3) 이라는 메소드는 char형으로 'e'라는 문자를 하나 반환하게 됩니다. (charAt() 메소드는 '0'부터 숫자가 시작되기 때문에 우리에게는 4번째 문자인 'e'가 반환되는 것입니다.)

length

public int length()

Returns the length of this string. The length is equal to the number of 16-bit Unicode characters in the string.

Returns:

the length of the sequence of characters represented by this object.









length()
메소드는 String형 문자열의 길이를 반환 합니다. 지금보신 length() 메소드는 java.lang.Object 클래스 안에 정의되어 있는 메소드로서 모든 클래스들이 반드시 상속 받기 때문에 거의 모든 클래스는 length()를 이용해서 길이를 구할수 있습니다. 예를 들어보면 String형 변수에 "testString" 라는 문자열이 들어가 있다고 생각하고 그 변수에 length() 메소드를 사용게 되면 우리는 쉽게 저장된 문자열의 길이 즉, 변수의 길이인 '8'을 리턴받을 수 있습니다.

indexOf

public int indexOf(String str)

Returns the index within this string of the first occurrence of the specified substring. The integer returned is the smallest value k such that:

this.startsWith(str, k)

is true.

Parameters:

str - any string.

Returns:

if the string argument occurs as a substring within this object, then the index of the first character of the first such substring is returned; if it does not occur as a substring, -1 is returned.

Throws:

NullPointerException - if str is null.



















indexOf() 메소드는 String형 문자열 안에 특정문자가 있는지를 검사하는 메소드입니다. String 문자열 안에 포함된 문자를 검사해서 indexOf() 메소드로 받은 인자가 있는지 확인한후 있으면 그 문자가 처음으로 위치한 index를 리턴합니다. (그 문자가 마지막으로 위치한 인덱스를 리턴하기 위하여 lastIndexOf() 라는 메소드를 사용할 수도 있습니다.) 예를들어 "test String".indexOf('s'); 라는 구문이 있다면 문자열 안의 's'의 위치(index) , '2' 라는 값(indexOf() 메소드도 문자열을 셀때 제일 처음은 0부터 시작합니다) int형 정수로 반환됩니다.

substring

public String substring(int beginIndex,int endIndex)

Returns a new string that is a substring of this string. The substring begins at the specified beginIndex and extends to the character at index endIndex - 1. Thus the length of the substring is endIndex-beginIndex.

Examples:

"hamburger".substring(4, 8) returns "urge"

"smiles".substring(1, 5) returns "mile"

Parameters:

beginIndex - the beginning index, inclusive.

endIndex - the ending index, exclusive.

Returns:

the specified substring.

Throws:

IndexOutOfBoundsException - if the beginIndex is negative, or endIndex is larger than the length of this String object, or beginIndex is larger than endIndex.























substring() 메소드는 인자로 int index값을 두개 받아 연산후 그 결과로 String형 문자열을 반환하는 메소드입니다. int형 정수로 인자를 두개 받는데 하나는 시작점으로, 남은 하나는 끝날 기준으로 문자열의 index(순서)를 받아 그에 해당하는 문자열을 출력해줍니다. 쉽게 표현해 보면 substring(시작할 위치, 끝날위치)로 표현할 수도 있습니다.그리고 간단한 예를 들어 보면 "freeman Forever".substring(3,6)라고 구문이 주어질 경우 이 메소드는 String형 문자열인 "ema"을 반환하게 됩니다. (문자열의 인덱스 3의 위치에서 6의 위치 전 까지의 문자열)

concat

public String concat(String str)

Concatenates the specified string to the end of this string.

If the length of the argument string is 0, then this String object is returned. Otherwise, a new String object is created, representing a character sequence that is the concatenation of the character sequence represented by this String object and the character sequence represented by the argument string.

Examples:

"cares".concat("s") returns "caress"

"to".concat("get").concat("her") returns "together"

Parameters:

str - the String that is concatenated to the end of this String.

Returns:

a string that represents the concatenation of this object's characters followed by the string argument's characters.

Throws:

NullPointerException - if str is null.























concat()
메소드는 String형 문자열의 뒤에 또다른 특정 String형 문자열을 붙일 수 있는 메소드입니다.우리가 흔히 출력할때 '+'를 이용하여 덧 붙여서 출력을 하는 방법과 거의 같은 기능을 하는 메소드로 만약, "test".concat("Print") 이라고 메소드를 사용하게 되면 이 구문은 리턴값으로 "testPrint"를 반환 하게 됩니다.

replace

public String replace(char oldChar,char newChar)

Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar.

If the character oldChar does not occur in the character sequence represented by this String object, then a reference to this String object is returned. Otherwise, a new String object is created that represents a character sequence identical to the character sequence represented by this String object, except that every occurrence of oldChar is replaced by an occurrence of newChar.

Examples:

"mesquite in your cellar".replace('e', 'o')

        returns "mosquito in your collar"

"the war of baronets".replace('r', 'y')

        returns "the way of bayonets"

"sparring with a purple porpoise".replace('p', 't')

        returns "starring with a turtle tortoise"

"JonL".replace('q', 'x') returns "JonL" (no change)

Parameters:

oldChar - the old character.

newChar - the new character.

Returns:

a string derived from this string by replacing every occurrence of oldChar with newChar.
































replace()
메소드는 '바꿈을 당할 문자' '바꿔야 할 문자'를 인자로 받아서 String형 문자열 안에서 '바꿈을 당할 문자'를 찾아 '바꿔야 할 문자'로 교체하는 작업을 해주는 메소드입니다. 예를 들어 test라는 String변수에 "PowerFul java"라는 문자열이 들어가 있다고 치고 여기에 replace('w','e')라는 메소드를 사용하게되면 test라는 변수는 인자로 받은 문자를 교체한후 "Poeer java"라는 문자열을 반환하게 됩니다.

toLowerCase

public String toLowerCase()

Converts all of the characters in this String to lower case using the rules of the default locale, which is returned by Locale.getDefault.

If no character in the string has a different lowercase version, based on calling the toLowerCase method defined by Character, then the original string is returned.

Otherwise, this method creates a new String object that represents a character sequence identical in length to the character sequence represented by this String object, with every character equal to the result of applying the method Character.toLowerCase to the corresponding character of this String object.

Examples:

"French Fries".toLowerCase() returns "french fries"

Returns:

the string, converted to lowercase.

See Also:

Character.toLowerCase(char), toUpperCase()
























toLowerCase() 메소드는 딱 보면 아시겠지만 String형 문자열을 모두 소문자로 대치시켜주는 메소드입니다. 예를 들어 "telMMMME".toLowerCase() 라는 구문은 대문자만이 모두 소문자로 대치되어 "telmmmme"를 반환하게 됩니다. 이것과 비슷하며 대칭되는 메소드가 하나 있는데 toUpperCase()라는 메소드입니다. 이 메소드는 toLowerCase()랑 정반대 되는 메소드로서 toLowerCase()가 대문자를 소문자로 바꿔주는 기능을 하는 대신에 toUpperCase()는 소문자를 대문자로 바꿔주는 기능을 합니다. 사용방법은 toLowerCase()와 똑같습니다. 보통 이와 같은 메소드는 키보드 입력을 받을때 대,소문자 상관없이 받은후 이벤트를 발생할 경우에 많이 사용됩니다. (왜 그런지는 추측해 보시면 아실수 있으실 겁니다.^^)

trim

public String trim()

Removes white space from both ends of this string.

If this String object represents an empty character sequence, or the first and last characters of character sequence represented by this String object both have codes greater than '\u0020' (the space character), then a reference to this String object is returned.

Otherwise, if there is no character with a code greater than '\u0020' in the string, then a new String object representing an empty string is created and returned.

Otherwise, let k be the index of the first character in the string whose code is greater than '\u0020', and let m be the index of the last character in the string whose code is greater than '\u0020'. A new String object is created, representing the substring of this string that begins with the character at index k and ends with the character at index m-that is, the result of this.substring(k, m+1).

This method may be used to trim whitespace from the beginning and end of a string; in fact, it trims all ASCII control characters as well.

Returns:

this string, with white space removed from the front and end.


























지금 보신 trim() 메소드는 문자 앞,뒤의 필요없는 여백을 제거해 주는 기능을 가지고 있는 메소드입니다.양쪽 여백을 제거해주기 때문에 불필요한 데이터를 제거하거나 String 문자열만을 추출할때 많이 사용됩니다. 예를 들어 "kim kimki " 라는 문장은 데이터 베이스나 하드등의 자료에 저장될때 10바이트가 소모됩니다.(1바이트 = 1글자) 왜냐하면 여백도 문자 하나처럼(1바이트) 인식하기 때문입니다. 그렇지만 사실 여백은 우리가 필요로 하는 자료는 아닙니다. 이럴경우 trim() 메소드를 사용하면 자동으로 문자열의 여백을 제거해 주고 우리가 원하는 문자열만 리턴해주게 됩니다. 에궁 힘드셨습니다. 여기까지가 String 클래스에서 기본적으로 자주 사용되는 메소드의 목록과 사용법에 관한 것들 입니다. 메소드의 기능들을 확인해 보셨으니까 어떤 식으로 이용하면 프로그램을 짜야할때 편하게 이용할지 다 생각이 있으리라고 믿습니다.^^ String 클래스는 은근히 자주 쓰이면서 잊어먹기 쉬운 클래스이니 꼭 기억하시길 바라겠고 마지막으로 모든 메소드의 기능을 확인하는 간단한 소스를  작성할테니 실행해보시고 메소드의 기능들을 확실하게 익히시기 바라겠습니다.

public class StringTest {  

         public static void main(String[] args){

                   String free = "Freeman's Javajaby";

                   System.out.println(free.charAt(4));

                   System.out.println(free.length());

                   System.out.println(free.indexOf("e"));  

                   System.out.println(free.substring(3,12));

                   System.out.println(free.concat(" da")); 

                   System.out.println(free.replace('e', 't'));       

                   System.out.println(free.toLowerCase());

                   System.out.println(free.toUpperCase());

                   System.out.println(free.trim());

                   }                

}

결과 :  

m

18

2

eman's Ja

Freeman's Javajaby da

Frttman's Javajaby

freeman's javajaby

FREEMAN'S JAVAJABY

Freeman's Javajaby

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