티스토리 뷰

자바에서 자료구조를 다루기 위해 수도없이 사용하는 collection framework에 대해 정리해보겠습니다.


0. 컬렉션 그리고 프레임워크

컬렉션: 여러 객체(데이터) 를 모아 놓은 것

프레임워크: 표준화, 정형화된 프로그래밍 방식, 라이브러리와는 다르게 프로그래머의 프로그래밍 방식을 강제한다.

프레임워크는 정해진 방식대로만 사용해야하기 때문에 customizing 이 어렵고, 그 사용법을 숙지해야 한다는 단점이 있지만,
그만큼 유지 보수가 편하고, 사용법을 숙지했을 경우에 생산성이 크게 증가한다는 장점이 있습니다. 

만약 우리가 사용하는 모든 자료구조에 대한 코드가 사람마다 전부 다르다면 협업과 소통에 아주 많은 비용이 들어갑니다.

따라서 java에서 collection 을 사용하는 방법을 표준화하여 제공 했는데, collection framework 입니다.

 

컬렉션 프레임워크 (collections framework)

  • 컬렉션(다수의 객체)를 다루기 위한 표준화된 프로그래밍 방식
  • 컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공 (저장, 삭제, 검색, 정렬)
  • java.utils 패키지에 포함. JDK1.2 부터 제공

1. 컬렉션 프레임워크의 핵심 인터페이스

인터페이스 특징 구현클래스
List 순서가 있는 데이터의 집합.
중복 허용
ArrayList, LinkedList, Stack, Vector
Set 순서가 없는 데이터의 집합
중복 허용 안함 
HashSet, TreeSet
Map key value의 쌍으로 이루어진 데이터 집합
key 는 중복 허용 안함, value 는 중복허용
순서 없음
HashMap, TreeMap, Hashtable,
Properties

이중 List 와 Set는 Colllection  인터페이스를 상속받았고, Map 은 최상위 인터페이스입니다. 

list, Map interface 와 구현체 diagram


2. Iterable / Iterator

위의 객체 diagram 을 보면 collectioin interface 가 Iterable interface 를 상속받고 있는 것을 확인할 수 있습니다.

iterable 인터페이스의 iterator() 메서드를 확인해보겠습니다. 

2-1. Iterator iterator()

iterable 인터페이스를 상속받은 객체들이 구현해야하는 메서드로서 iterator()의 반환 타입은 Iterator 객체입니다.

public interface Iterable<T> {
    Iterator<T> iterator();
    ...
}

자바의 컬렉션 프레임웍에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화 하였는데 그 중 하나가 Iterator 입니다.

모든 collection이 Iterator 객체를 반환하는 iterator() 메서드를 구현하기 때문에 컬렉션의 종류를 모를때 가장 쉽고 안정성있게 사용할 있는것이 Iterator 객체입니다.
또한 대부분의 구현체들이 iterator() 메서드를 구현할때 fail-fast 방식으로 구현하기 때문에 다음 요소를 반복하기 전에 컬렉션의 변경사항을 확인합니다. 따라서 안전하게 접근할 수 있습니다.

fail-fast : 동작 중에 에러가 발생하면 바로 에러 표시 후 정지, iterator 의 구현체들은 동작중에 컬렉션의 변화가 감지되면 ConcurrentModificationException을 던지고 정지


iterator() 의 메서드

boolean hasNext() 다음 값이 있으면 true 반환
Object next() 다음 값이 있으면 객체 반환, 없으면
NoSuchElementException 을 터트린다.
void remove() 반드시 next() 가 호출된 이후에 한번만 사용될 수 있으며, next() 로 가져온 객체를 삭제한다. remove() 메서드는 구현하지 않아도 되며 구현되지 않은 경우 UnsupportedException 이 터진다.

예를 들어 1 ~ 10 의 정수가 들어있는 ArrayList 에서 짝수만 남기는 코드를 Iterator 객체를 이용하면 다음과 같이 작성할 수 있습니다.

List numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
for (Iterator<Integer> iter = numbers.iterator(); iter.hasNext(); ) {
    if (iter.next() % 2 == 0)
        iter.remove();
}
System.out.println("numbers = " + numbers);

물론 Collection의 removeIf 메서드를 이용하면 훨씬 짧게 구현할 수 있습니다. 

하지만 구현 컬렉션들에 어떤 메서드가 어떤 방식으로 구현되어 있는지 확인하기 힘들때 사용할 수 있는것이 iterator() 메서드 입니다.


3. Collection 인터페이스의 메서드

기능 메서드 설명
추가 boolean add (Object o)
boolean addAll (Collection c)
지정된 객체 또는 Collection 의 객체들을 Collection 에 추가한다.
삭제 void clear() 컬렉션의 모든 객체 삭제
boolean remove(Object o)
boolean removeAll(Collection c)
지정된 객체 혹은 collection c 에 포함된 객체를 전부 삭제한다, 변화가 있으면 true
boolean retainAll(Collection c) 지정된 Collection에 포함된 객체만을 남기고 다른 객체 삭제, 삭제되어 변화가 생기면 true
boolean removeIf(Predicate filter) Predicate 의 인자로 collection의 객체를 넣고 filter 에 true 면 삭제
검색 boolean contains(Object o)
boolean containsAll(Collection c)
객체 혹은 컬렉션을 포함하고 있는지 확인
컬렉션 정보 int size() 저장된 객체의 개수 반환
boolea isEmpty() 컬렉션이 빈 컬렉션인지를 확인
변형 Object[] toArray() 배열로 변환
Stream stream Stream 객체로 변환

위의 메서드외에도 hashCode(), equals() 등 Object 메서드들이 포함되어 있습니다. 

컬렉션을 상속받은 구현체들은 각자 자료구조의 특징을 살려 위의 메서드들을 구현하고, 그 구현방식에서 차이점을 갖게 됩니다. 

추가 삭제 검색 이라는 기본 기능을 각 구현체들이 자신의 바로 상위 인터페이스 (List, Set)의 특징을 살려서 어떻게 구현하느냐에 집중하면서 다음 포스트에서 List, Set 의 구현체들을 살펴보겠습니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함