Java 입문 | java.util 패키지 - 콜렉션 | List 인터페이스 및 관련 클래스


List 인터페이스

List 인터페이스는 순차적인 객체 집합들을 다루기 위한 Java Collection Framework의 인터페이스이다. Java Collection Framework의 최상위 인터페이스인 Collection 인터페이스를 상속받았고, 중복된 데이터를 포함할 수 있다. List 인터페이스를 구현한 하위 클래스로는 ArrayList, LinkedList, Vector, Stack 등이 있다.

  • List
    • ArrayList
    • LinkedList
    • Vector
      • Stack

List 메소드

메소드 설명
void add(int index, E element) index에 객체(element)를 추가한다.
boolean addAll(int index, Collection<? extends E> c) index에 콜렉션 객체를 추가한다.
E get(int index) List의 index번째 객체를 반환한다.
int indexOf(Object o) List의 첫 번째 요소부터 순방향으로 검색하여 객체 o의 index(위치)를 반환한다. List에 객체가 없다면 - 1을 반환한다.
int lastIndexOf(Object o) List의 마지막 요소부터 역방향으로 검색하여 객체 o의 index(위치)를 반환한다. List에 객체가 없다면 - 1을 반환한다.
ListIterator<E> listIterator() List의 객체에 접근 할 수 있는 ListIterator를 반환한다.
ListIterator<E> listIterator(int index) index부터 시작한 List의 객체에 접근 할 수 있는 ListIterator를 반환한다.
E remove(int index) index번째 객체를 삭제하고 삭제된 객체를 반환한다.
Object set(int index, E element) index번째에 객체를 저장하고 index번째에 있었던 이전 객체를 반환한다.
List<E> subList(int fromIndex, int toIndex) fromIndex(포함)번째부터 toIndex(제외)번째까지 List 객체를 반환한다.

ListIterator 인터페이스

ListIterator는 Iterator를 상속한 인터페이스이다. Collection에서 제공하는 Iterator인터페이스는 Collection을 한방향으로 탐색하면서 객체에 대한 정보를 얻는다. ListIterator는 List에서 제공하는 인터페이스로 List에 포함된 모든 객체를 양방향으로 탐색하면서 객체를 꺼낼 수 있는 방법을 제공한다. ListIterator 이용하면 양방향으로 움직여가면서 수정이라던가, Iterator의 현재 위치를 알아낼 수 있다. List를 사용하는 경우에는 Collection에서 제공하는 Iterator는 물론이고 보다 확장된 기능을 갖고 있는 ListIterator를 사용할 수 있다.

ListIterator 메소드

메소드 설명
boolean hasNext() Iterator를 다음 방향으로 객체가 존재하는지 여부를 반환한다.
boolean hasPrevious() Iterator를 이전 방향으로 객체가 존재하는지 여부를 반환한다.
Object next() Iteration에서 다음 객체를 반환한다.
Object previous() Iteration에서 이전 객체를 반환한다.
void remove() next() 또는 previous()로 반환된 마지막 객체를 제거한다.
void set(Object o) next() 또는 previous()로 반환된 마지막 객체를 입력 받은 객체(o)로 변경한다.
int nextIndex() Iteration에서 다음 객체의 인덱스를 반환한다.
int previousIndex() Iteration에서 이전 객체의 인덱스를 반환한다.
void add(Object o) List에 객체(o)를 추가한다.

ArrayList 클래스

ArrayList는 크기가 가변 가능한 Array로서 구현된 클래스이다. 크기가 가변되는 점을 제외하고는 일반 Array와 동일하게 사용되어 질 수 있고 성능도 마찬가지이다. random access가 가능하므로 get()/set()의 성능이 좋은 반면 add()/remove()의 성능은 나쁘다.

ArrayList는 동적으로 크기가 변경이 되는데, 설정된 초기 크기보다 많은 데이터가 저장될 때는 자동으로 크기가 늘어나며, 저장된 데이터가 삭제될 경우에는 자동으로 크기가 줄어든다.

ArrayList 생성자

생성자 설명
ArrayList() 디폴트 생성자. 기본 크기의 객체를 생성한다.
ArrayList(Collection<? extends E> c) Collection을 입력받아 객체를 생성한다.
ArrayList(int initialCapacity) 용량을 지정하여 객체를 생성한다.

ArrayList 예제

package com.devkuma.tutorial.java.util;

import java.util.ArrayList;
import java.util.List;

public class ArrayListClass {

    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();

        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        list.add("E");
        list.add("F");

        System.out.println("list :" + list);
        System.out.println("size : " + list.size());
        System.out.println("get : " + list.get(0));

        list.set(2, "CC");
        System.out.println("set : " + list);

        list.add(1, "AA");
        System.out.println("add : " + list);

        list.remove(2);
        list.remove("F");
        System.out.println("remove : " + list);

        for (String str : list) {
            System.out.println("for : " + str);
        }
    }
}

실행 결과는 아래와 같다.

list :[A, B, C, D, E, F]
size : 6
get : A
set : [A, B, CC, D, E, F]
add : [A, AA, B, CC, D, E, F]
remove : [A, AA, CC, D, E]
for : A
for : AA
for : CC
for : D
for : E

LinkedList 클래스

LinkedList는 doubly linked list로서 구현된 클래스이다. List이므로 get()/set()에서의 성능이 좋지 않다.

Vector 클래스(Legacy)

java.util.Collection의 Legacy 클래스인 Vector는 ArrayList와 동일하다. 차이라면 Vector는 synchronized라는 것이다. 이로인해 ArrayList에 비해 성능적으로 불리하다. 많은 java 프로그래머들은 Vector대신 ArrayList를 사용하며, synchronized가 필요한 경우조차도 명시적으로 ArrayList를 synchronized하는 방법을 선호한다. 즉, Vector 클래스는 잘 사용되지 않는 클래스이다.

참고

http://hochulshin.com/java-collection-list/
http://scarlett.tistory.com/entry/자바공부-5List-인터페이스와-ListIterator-인터페이스