2008. 8. 14. 17:53

자바를 자바답게 하는클래스[Collection]

Collection 인터페이스

Collection 인터페이스는 데이터의 집합을 표현하는 인터페이스로 자료 구조 관련 API의 최 상위 인터페이스이다. Collection을 구성하는 데이터를 요소(Element)라고 하는데 이들 요소를 추가하거나 삭제하는 등의 데이터 관리 기능을 제공한다. Collection 인터페이스는 자료의 관리 방법에 따라 Set, List, Map으로 분류한다.

 public interface Set extends Collection

 public interface List extends Collection

 public interface Map

 

Set, List, Map도 인터페이스이고 이들을 구현하는 클래스는 다음과 같다.

 

인터페이스

 

클래스

 

Set

 

HashSet, TreeSet

 

List

 

ArrayList, LinkedList, Vector

 

Map

 

HashMap,TreeMap, Hashtable

 

 

 

이들 클래스들을 살펴보고 활용해 보자.

 

 

Set

Set 인터페이스를 구현하는 클래스로 HashSet과 TreeSet이 있다. 이들 클래스는 다음과 같은 특징을 가진다.

 

·중복된 데이터를 허용하지 않는다.

·데이터의 순서가 없다.

 

HashSet에서 제공하는 메소드를 살펴보고 몇 개의 예제를 해보면 HashSet이 어떤 것인지 알 수 있을 것이다.

 

HashSet 클래스의 유용한 메소드

 

public boolean add(Object o)

객체 o를 추가한다. o가 이미 존재하면 추가하지 않는다.

o가 추가되었을 경우 true를, 추가되지 않았을 경우 false를 반환한다.

 

public boolean remove(Object o)

객체 o를 제거하고 true를 반환한다. o가 존재하지 않는 요소이면 false를 반환한다.

 

public void clear()

모든 요소를 제거한다.

 

public boolean contains(Object o)

객체 o가 요소로 존재하면 true를, 아니면 false를 반환한다.

 

public boolean isEmpty()

요소가 하나도 없으면 true를, 아니면 false를 반환한다.

 

public int size()

요소의 개수를 반환한다.

 

다음 예제는 HashSet에 요소를 추가하고 삭제해보는 것이다.

 

##HashSet1.java##

 

import java.util.*;

public class HashSet1{

  public static void main(String[] args){

    HashSet hset = new HashSet();

    System.out.println("세 개의 요소를 추가 합니다.");

    hset.add("안녕");

    hset.add("Hello");

    hset.add("방가");

    System.out.println("요소의 개수: "+hset.size());

   

    System.out.println("하나의 요소를 제거합니다.");

    hset.remove("안녕");

    System.out.println("요소의 개수: "+hset.size());

  }

}


 
##출력 결과##
 

세 개의 요소를 추가합니다.

요소의 개수: 3

하나의 요소를 제거합니다.

요소의 개수: 2

 


 

 

Set은 중복된 데이터를 허용하지 않는다. 다음 예제로 확인하자.

 

 ##HashSet2.java##

import java.util.*;

public class HashSet2{

  public static void main(String[] args){

    HashSet hset = new HashSet();

    System.out.println("세 개의 요소를 추가합니다.");

    hset.add("안녕");

    hset.add("Hello");

    hset.add("안녕");                               // 중복된 요소

    System.out.println("요소의 개수: "+hset.size());

  }

}


##출력 결과##
 

세 개의 요소를 추가합니다.

요소의 개수: 2


 

 

 

List

List를 구현하는 클래스로 ArrayList, LinkedList, Vector가 있다. 이들 클래스는 다음과 같은 특징을 가진다.

중복된 데이터를 허용한다.

데이터의 순서가 있다.

List 중에서 많이 사용되는 Vector 클래스를 살펴보자.
 
Vector 클래스의 유용한 생성자
 
public Vector()
빈 vector를 만든다.
 
public Vector(int initialCapacity)
초기 용량을 initialCapacity로 하는 vector를 만든다.
 
public Vector(int initialCapacity, int capacityIncrement)
초기 용량을 initialCapacity로 하는 vector를 만든다.
용량이상의 데이터가 추가되면 capacityIncrement만큼의 용량이 추가된다.
 

Vector 클래스의 유용한 메소드

public synchronized boolean add(Object obj)

public synchronized void addElement(Object obj)

주어진 요소 obj를 vector의 끝에 추가한다.

public void add(int index, Object element)

주어진 요소 element를 index 위치에 추가한다.

public synchronized boolean removeElement(Object obj)

public synchronized void removeElementAt(int index)

주어진 요소(obj) 또는 주어진 위치(index) 요소를 제거한다.

public int indexOf(Object elem)

요소 elem이 처음으로 검색된 위치를 반환한다.

public synchronized int capacity()

용량을 반환한다.

public synchronized Object elementAt(int index)

index위치의 요소를 반환한다.

public Enumeration elements()

벡터의 요소들로 구성된 Enumeration 객체를 반환한다.

public int size()

요소의 개수를 반환한다.

 

 

다음은 빈 벡터를 만들어 요소를 추가하고 출력해보는 예제이다.

 

##Vector1.java##

 

import java.util.*;

public class Vector1{

  public static void main(String[] args){

     Vector v=new Vector();              // 빈 벡터 객체를 만든다.

 

     // 요소를 추가한다.

     v.addElement("안녕");

     v.addElement(new Integer(7));

     v.addElement(new Double(5.2));

     v.addElement(new StringBuffer("abc"));

     v.addElement("벡터");

     

     // 모든 요소를 출력한다.

     for(int i=0;i<v.size();i++){

       System.out.println(v.elementAt(i)); // i 번째 원소를 출력한다.

     }

  }

}


##출력 결과##

  안녕

7

5.2

abc

벡터


 

 

다음은 추가, 삭제, 출력을 사용자가 선택하여 처리할 수 있게 하는 예제이다.

 

##Vector2.java##

 

   import java.util.*;

import java.io.*;

public class Vector2{

 

  // vector v의 모든 요소를 화면에 출력하는 메소드

  static void displayVector(Vector v){

    System.out.println("\n-------목록-------");

    for(int i=0;i<v.size();i++){

      System.out.print(v.elementAt(i)+" ");

    }

    System.out.println("\n------------------\n");

  }

 

  public static void main(String[] args) throws IOException{

    Vector v=new Vector();

      InputStreamReader isr=new InputStreamReader(System.in);        // x1

      BufferedReader br =new BufferedReader(isr);                     // x2

    String select;                                       // 메뉴 선택을 위한 변수

    while(true){                                         // 무한 루프

      System.out.println("<< 1.추가 2.삭제 3.종료 >>");

      System.out.println("선택하세요....");

      select=br.readLine();                           // 사용자가 메뉴를 선택한다.

      if(select.equals("1")){                          // 선택한 메뉴가 1이면

        System.out.println("추가할 문자열을 입력하세요.");

        v.add(br.readLine());       // 키보드로부터 문자열을 입력받아서 v에 추가

        displayVector(v);

      }

      else if(select.equals("2")){                        // 선택한 메뉴가 2이면

        System.out.println("요소의 번호를 입력하세요(0부터 시작).");

 

        // 키보드로부터 입력받은 번호에 있는 요소를 제거한다.

        v.removeElementAt(Integer.parseInt(br.readLine()));       // x3

 

        displayVector(v);

      }

      else if(select.equals("3")) break;  // 3을 선택하면 while을 빠져 나온다.

    }

  }

}


##출력 결과##

...

-------목록-------

홍길동 김동길

------------------

 

<< 1.추가 2.삭제 3.종료 >>

선택하세요....

1 ??

추가할 문자열을 입력하세요.

이해봄 ??

 

-------목록-------

홍길동 김동길 이해봄

------------------

...


 

약간 복잡해 보이나 그렇게 어렵지 않는 예제이다.

 

x1행과 x2행을 줄여서 다음과 같이 할 수도 있다.

 

 

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

 

 

##혼자 해보기##

'Vector2.java'에서 발생할 수 있는 예외 상황을 처리해보자. 또, 주어진 위치에 원소를 삽입하는 메뉴를 추가해보자.

 

   

##출력결과##

   ...

-------목록-------

홍길동 김동길

------------------

 

<< 1.추가 2.삽입 3.삭제 4.종료 >>

선택하세요....

2 ??

추가할 문자열을 입력하세요.

이해봄 ??

요소의 위치를 입력하세요.

1 ??

-------목록-------

홍길동 이해봄 김동길

------------------

...

 


 

 

 

Map

Map를 구현하는 클래스로 HashMap,TreeMap, Hashtable이 있다. 이들 클래스는 다음과 같은 특징을 가진다.

 

·요소에 대한 고유의 key가 존재한다.

·key는 중복될 수 없다.

 

 

Hashtable에 대하여 살펴보자.

 

Hashtable 클래스의 유용한 메소드

 

public synchronized Object put(Object key, Object value)

key를 가지는 요소, value를 추가한다.

 

public synchronized Object remove(Object key)

key를 가지는 요소를 제거한다.

 

public synchronized Object get(Object key)

key를 가지는 요소를 반환한다.

 

public synchronized boolean containsKey(Object key)

key를 가지는 요소가 있으면  true를, 아니면 false를 반환한다.

 

public boolean containsValue(Object value)

public synchronized boolean contains(Object value)

Map에 value가 있으면 true를, 아니면 false를 반환한다.

 

public synchronized Enumeration elements()

Enumeration 객체를 반환한다.

 

 

주민등록번호는 유일한 것으로 사람에 대한 key로 사용될 수 있다. 다음 예제를 해보자.

 

##Hashtable1.java##

 

import java.util.*;

public class Hashtable1{

  public static void main(String[] args){

    Hashtable ht=new Hashtable();

 

    // 주어진 키와 요소를 추가한다.

    ht.put("001131-1234567","홍길동");

    ht.put("010230-2345678","김순희");

    ht.put("020931-1456007","박철수");

    ht.put("111228-1899001","이순돌");

   

    if(ht.containsKey("020931-1456007")) // 주어진 키를 가지는 요소가 있으면

      ht.remove("020931-1456007");     // 주어진 키를 가지는 요소를 삭제한다.

 

   System.out.println("요소의 개수: "+ht.size());  // 요소의 개수를 출력한다.

 

   // 모든 요소를 출력한다.

     System.out.println("<목록>");

     for(Enumeration e=ht.elements(); e.hasMoreElements(); )

       System.out.println(e.nextElement());

  }

}


##출력 결과##

요소의 개수: 3

<목록>

김순희

이순돌

홍길동