1. The Collection Interface
Collection
은 엘리먼트라고 하는 객체들의 그룹을 표현하는 것이다. Collection Interface는 가장 일반적인 형태의 요구사항에 대해서 객체의 컬렉션과 인터페이스를 정의한 것이다. 예를 들어 모든 범용 컬렉션을 구현하고자 할때 생성자에서 Collection 아규먼트를 받는다고 한다면, 이러한 생성자는 conversion constructor이라고 알려진 것이다. 컬렉션 초기화에서 특정한 컬렉션에 포함된 내용을 이용할때, 주어진 컬렉션이 하위 인터페이스이든, 새로 구현된 형태이든 가능하도록 할때 이용된다. 다른말로 이 컬렉션을 원하는 컬렉션 타입으로 컨버팅이 가능하다는 말이 된다.가정해보면, Collection<String>이라는 것을 가지고 있다면 이것은 리스트가 될수도 있고, Set이 될수도 있으며, 혹은 다른 형태의 Collection이 될 수 있다. 이 용어는 new ArrayList 생성을 통해서 객체를 가리킬 수 있고, 모든 형태의 element를 포함할 수 있다.
다음은 Collection 인터페이스를 보여준다.List<String> list = new ArrayList<String>(c);
인터페이스는 객체의 그룹으로 주어진 컬렉션이 기대하고 있는 어떠한 행동을 하는가에 대해서 표현한다.public interface Collection<E> extends Iterable<E> {
// Basic operations
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element); //optional
boolean remove(Object element); //optional
Iterator<E> iterator();
// Bulk operations
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c); //optional
boolean removeAll(Collection<?> c); //optional
boolean retainAll(Collection<?> c); //optional
void clear(); //optional
// Array operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
인터페이스는 얼마타 많은 엘리먼트가 있는지 조사하는 size, isEmpty를 가지고, 해당 객체가 컬렉션에 포함되어 있는지 조사하는 contains, 엘리먼트를 컬렉션에 넣어주는 add, remove 그리고 컬렉션을 반복하는 iterator이 있다.add 메소드는 보통 엘리먼트가 중복이 되어도 된다는 의미를 지닌다. 이것은 컬렉션이 지정된 엘리먼트가 모든 내용을 호출했을때 반드시 그 엘리먼트가 존재한다는 것을 보장하고, 그 결과로 true를 반환한다는 것을 말해준다. 유사하게 remove 메소드는 컬렉션으로 부터 특정한 엘리먼트의 단일 인스턴스를 제거하도록 하고 있으며, 포함되는 엘리먼트가 존재하는 경우 true를 반환하게 될 것이다.
컬렉션 탐색
컬렉션을 탐색하는 데는 2가지 방법이 있다. 하나는 for-each이며, 다른하나는 Iterators를 이용하는 것이다.for-each Construct
for-each 구문은 간단하게 컬렉션이나 배열을 for loop를 이용하여 탐핵할 수 있도록 한다. The for Statement. 참조
다음과 같은 코드는 for-each를 이용하여 컬렉션에 포함된 엘리먼트를 출력하는 코드이다.for (Object o : collection)
System.out.println(o);
Iterators
Iterator
는 컬렉션을 통해서 탐색이 가능하도록 하거나, 선택적으로 엘리먼트를 제거하는데 이용한다.
Iterator을 컬렉션으로 부터 iterator메소드를 호출함으로 해서 획득할 수 있으며, 다음과 같은 인터페이스를 이용하여 처리한다.hasNext메소드가 true를 반환하는 경우 반복해야할 엘리먼트가 더 존재한다는 말이다. next 메소드는 iteration에서 다음 엘리먼트를 가져오는 역할을 한다. remove 메소드는 next 에의해서 가져올 엘리먼트를 반환하면서 제거하는 역할을 수행한다. remove 메소드는 next 메소드 이후에 한번만 호출 되어야 한다. 만약 이러한 규칙을 지키지 않으면 Exception을 던질 것이다.public interface Iterator<E> {
boolean hasNext();
E next();
void remove(); //optional
}
Iterator.remove는 iterattion에서만 안전하게 컬렉션을 변경하는 작업을 수행한다. 그렇지 않고 다른 반복적인 작업을 통해서 remove를 처리한다면, 기대하지 않은 행동을 수행할 것이다.
Iterator 대신에 for-each를 이용하고자 한다면 다음을 고려해야한다.
다음 메소드는 유동적인 Collection을 Iterator을 이용하여 필터링을 처리하는지에 대해서 보여주고 있다. 이것은 특정한 엘리먼트를 컬렉션에서 탐색을 하면서 제거하는 역할을 한다.
- 현재 엘리먼트를 제거한다. for-each 에서 iterator을 숨긴경우 remove를 호출할 수 없다. 그러므로 for-each는 filtering을 할때 유용하지 않다.
- 복잡한 멀티플 컬렉션을 반복할때 주의해야한다.
이 단순한 코드는 다형적인 부분이 있다. 이 의미는 어떠한 컬렉션이든 동작하도록 수행하고 있다. 이 예제는 어떻게 Java Collection Framework를 이용하여 쉽게 폴리몰피즘 알고리즘을 사용하는지 보여주는 예이다.static void filter(Collection<?> c) {
for (Iterator<?> it = c.iterator(); it.hasNext(); )
if (!cond(it.next()))
it.remove();
}
Bulk 작업을 처리하는 Collection Interface
Bulk 오퍼레이션은 컬렉션 전체를 처리하는 것을 말한다.
이러한 처리는 단순한 오퍼레이션을 이용하여 구현할 수 있다. 또한 대부분의 케이스에서는 성능 저하가 발생되지 않도록 구현하고 있다. 다음은 벌크 오퍼레이션들이다.addAll과 removeAll 그리고 retailAll 메소드는 대상 컬렉션에 대한 처리가 완료되고 나면 true를 반환한다.
containsAll
— 특정 컬렉션에서 제시한 모든 엘리먼트가 포함되어 있는지 검사하고, 그러한 경우 true를 반환한다.addAll
— 대상 컬렉션에 특정 컬렉션 전체를 추가한다.removeAll
— 해당하는 컬렉션의 모든 엘리먼트를 제거한다. 또한 특정한 컬렉션들만 제거할 수 있다.retainAll
— 대상 컬렉션으로 부터 특정 컬렉션에 포함되어 있지 않은 엘리먼트 모두를 제거한다.clear
— 컬렉션 내에 존재하는 모든 엘리먼트를 제거한다.단순한 예제를 보면 bulk 오퍼레이션의 파워를 볼수 있다. 다음과 같이 특정 엘리먼트 e를 대상 컬렉션 c에서 모두 제거하고자 하는 경우 다음과 같이 처리한다.
좀더 특별하게 모든 널 엘리먼트를 제거하고자 한다면 다음과 같이 처리할 수 있다.c.removeAll(Collections.singleton(e));
이러한 용어는 Collections.singleton을 이용하여 처리할 수 있는데, 이것은 정적 팩토리 메소드를 이용하여 지정된 엘리먼트를 포함하는 셋을 불변으로 변경하여 처리하는 방식이다.c.removeAll(Collections.singleton(null));
배열 처리를 위한 Collection Interface
toArray 메소드는 컬렉션과 배열 사이에서 브릿지 역할을 수행한다. array 오퍼레이션은 Collection에 포함된 내용을 배열로 변환하는 역할을 한다. 단순한 형태는 아규먼트가 없는 배열 객체를 생성하여 처리하는 것이다. 더욱 복잡한것은 실행시간에 배열로 출력하는 형태가 될 것이다.c가 오직 문자열만 포함하고 있다면 다음과 같은 것도 지원이 된다. (아마도 Collection은 Collecdtion<String> 타입이 되어야 할 것이다.)Object[] a = c.toArray();
다음 문장은 c의 내용을 새로운 String 배열에 넣는 작업을 한다. a의 길이는 c의 총 엘리먼트 개수가 된다.String[] a = c.toArray(new String[0]);
'WEB_Programming > Pure Java' 카테고리의 다른 글
The SortedSet Interface (0) | 2008.11.03 |
---|---|
Object Ordering (0) | 2008.10.29 |
The Map Interface (0) | 2008.10.28 |
The Queue Interface (0) | 2008.10.28 |
The List Interface (0) | 2008.10.24 |