컬렉션 프레임웍

박민수·2023년 1월 30일
0

자바의 정석

목록 보기
11/17
post-thumbnail

1. 컬렉션 프레임웍(Collections Framework)이란?

데이터 군을 저장하는 클래스들을 표준화한 설계
다수의 데이터를 다루는 데 필요한 클래스들을 제공

컬렉션은 다수의 요소를 하나의 그룹으로 묶어 효율적으로 저장하고, 관리할 수 있는 기능을 제공하는 일종의 컨테이너이다. 배열은 크기가 고정되어 있는데에 반해, 컬렉션 프레임워크는 가변적인 크기를 갖는 (Resizable) 등의 특징을 갖는다. 또한 데이터 삽입, 탐색, 정렬 등 편리한 API 를 다수 제공한다. 이런 이점으로 개발자는 배열보다는 적절한 컬렉션 클래스를 선택해 사용하는 것이 권장된다.

컬렉션 프레임워크의 장점

(1) List, Queue, Set, Map 등의 인터페이스를 제공하고, 이를 구현하는 클래스를 제공하여 일관된 API 를 사용할 수 있다.

(2) 가변적인 저장 공간을 제공한다. 고정적인 저장 공간을 제공하는 배열에 대비되는 특징이다.

(3) 자료구조, 알고리즘을 구현하기 위한 코드를 직접 작성할 필요 없이, 이미 구현된 컬렉션 클래스를 목적에 맞게 선택하여 사용하면 된다.

(4) 제공되는 API 의 코드는 검증되었으며, 고도로 최적화 되어있다.

컬렉션 프레임워크의 종류

(1) Collection 인터페이스

List와 Set의 조상인 Collection에는 저장된 데이터를 읽고, 추가하고 삭제하는 등의 기본적인 메서드들을 정의하고 있다.

Collection에는 아래와 같은 메서드가 정의되어 있다.

-매개변수 o는 object, c는 collection이다. -

boolean add(o)
boolean addAll(c)
지정된 객체(o) 또는 Collection(c)의 객체들을 Collection에 추가한다

clear()
Collection의 모든 객체 삭제

boolean contains(o)
boolean containsAll(c)
지정된 객체(o) 또는 Collection(c)의 객체들이 Collection에 포함되어 있는지 확인

boolean equals()
동일한 Collection인지 비교

hashCode()
Collection의 hash code반환

boolean isEmpty()
Collection이 비어있는지 확인

iterator()
Collection의 iterator를 얻어서 반환

boolean remove()
지정된 객체 삭제

boolean removeAll()
지정된 Collection에 포함된 모든 객체 삭제

boolean retainAll()
지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제, 이 작업으로 변화가 있으면 true, 없으면 false

size()
Collection에 저장된 객체의 개수 반환

toArray()
Collection에 저장된 객체를 객체배열(object[])로 반환

toArray(object[] a)
지정된 배열에 Collection의 객체를 저장해서 반환

(2) List

순서가 있는 데이터의 집합
데이터의 중복을 허용한다.
List에는 아래와 같은 메서드가 정의되어 있다.
(Collection으로부터 상속받은 것은 제외)

add(index, element)
addAll(index, Collection)
지정된 위치에 객체 또는 Collection에 포함된 객체들을 추가한다

get(index)
지정된 위치에 있는 객체 반환

indexOf()
지정된 객체의 위치를 반환(순방향)

lastIndexOf()
지정된 객체의 위치를 반환(역방향)

listIterator()
List의 객체에 접근할 수 있는 listIterator를 반환

remove(index)
지정된 위치에 있는 객체를 삭제하고 삭제된 객체를 반환

set(index, element)
지정된 위치에 객체 저장

sort(compartor)
지정된 비교자로 List 정렬

subList(from, to)
지정된 범위에 있는 객체 반환

ArrayList
ArrayList는 기존의 Vector를 개선한 것
데이터의 저장순서가 유지되고 중복이 허용된다.
collection과 list의 메서드를 물려받아 거의 동일

clone()
ArrayList를 복제

ensureCapacity(capacity)
ArrayList의 용량이 최소한 capacity가 되게 한다

trimToSize()
용량에 맞게 크기를 줄인다
// list1과 list2 존재한다는 가정하에

for(int = list2.size()-1; i > =0; i--){
	if(list1.contains(list2.get(i))
    	list2.remove(i);
} 
// list1에 있는 값이 list2에도 있다면 list2에서 값 제거

주의할 점은 만약 ArrayList의 값을 제거하기 위한 상황이라면
list2의 요소를 제거하기 위해서 반복문을 "list2.size()-1" (list2의 마지막부터 반복 시작)감소시키면서 거꾸로 반복시켜야 한다.
왜냐하면 변수 i를 증가시키면서 제거하면, 한 요소가 삭제될때마다 빈 공간을 채우기 위해 나머지 요소들이 자리이동을 해야하기 때문에 올바른 결과를 얻을 수 없다.

ArrayList단점
ArrayList나 Vector같이 배열을 이용한 자료구조는 데이터를 읽어오고 저장하는 데는 효율이 좋지만, 용량을 변경해야할 때는 새로운 배열을 생성한 후 데이터를 복사해야하기 때문에 효율이 떨어진다.
즉 크기를 변경할 수 없으며, 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
이를 극복하기 위해서 나온 것이 "LinkedList"이다.

LinkedList

LinkedList는 불연속적으로 존재하는 데이터를 서로 연결(link)한 형태로 구성되어 있다.
각 요소들은 자신과 연결된 다음 요소에 대한 참조(주소값)와 데이터로 구성되어 있다.
LinkedList의 데이터 삭제는 삭제하고자 하는 요소의 이전요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하기만 하면 된다.
단 하나의 참조만 변경하면 되기에 데이터를 이동, 복사하는 과정이 없어 속도가 매우 빠르다.
아래는 LinkedList의 메서드이다. (List인터페이스를 구현했기에 거의 비슷하다.)

element()
첫 번째 요소 반환

boolean offer()
지정된 객체를 끝에 추가

peek()
첫 번째 요소 반환

poll()
첫 번째 요소 반환 후 제거

object remove()
첫 번째 요소 제거

add
+First(),Last()
맨 앞(뒤)에 객체 추가

get
첫 번째(마지막) 요소 반환

peek
첫 번째(마지막) 요소 반환

pull
첫 번째 요소(마지막) 반환 후 제거

remove
첫 번째(마지막) 요소 제거

단 LinkedList는 이동방향이 단방향이기 때문에 이전 요소에 대한 접근은 어렵다.
이를 극복하기 위해서 나온 것이 "doubly circular Linked list(이중 원형 연결리스트)"이다.

doubly circular Linkedlist(이중 원형 연결리스트)

Linkedlist와 달리 '이전 노드'를 가리키는 변수가 추가된 양방향 리스트이다.
Linkedlist에 비해 검색(색인) 능력이 좋아졌다.

정리

  • 순차적으로 추가/삭제할 때는 ArrayList가 LinkedList보다 좋다.

  • 중간에 데이터를 추가/삭제할 때는 LinkedList가 ArrayList보다 좋다.

  • 검색할 때는 ArrayList가 LinkedList보다 빠르다.
    LinkedList는 처음부터 n번째까지 차례대로 데이터를 읽어와야 하기 때문이다.

(3) Set

  • HashSet
    HashSet은 Set의 가장 대표적인 컬렉션이다.
    중복된 요소를 저장하지 않는다.
    저장순서를 유지하지 않는다.
    Set은 수학의 집합을 생각하면 된다.

저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다.

아래는 Set의 메서드이다. Collection과 거의 동일하다.

boolean add(o)
boolean addAll(c)
지정된 객체(o) 또는 Collection(c)의 객체들을 Collection에 추가한다 (합집합)

clear()
Collection의 모든 객체 삭제

boolean contains(o)
boolean containsAll(c)
지정된 객체(o) 또는 Collection(c)의 객체들이 Collection에 포함되어 있는지 확인

boolean isEmpty()
Collection이 비어있는지 확인

iterator()
Collection의 iterator를 얻어서 반환

boolean remove()
지정된 객체 삭제

boolean removeAll()
지정된 Collection에 포함된 모든 객체 삭제

boolean retainAll()
지정된 Collection에 포함된 객체만을 남기고 다른 객체들은 Collection에서 삭제, 이 작업으로 변화가 있으면 true, 없으면 false (차집합)

size()
Collection에 저장된 객체의 개수 반환

toArray()
Collection에 저장된 객체를 객체배열(object[])로 반환

toArray(object[] a)
지정된 배열에 Collection의 객체를 저장해서 반환

Set 구현 예제

 Object[] num = {"1", new Integer(1), "2", "2", "3", "3"};
        Set set = new HashSet<>();

        for(int i =0; i<num.length; i++){
            set.add(num[i]);
        }

        System.out.println(set); // [1, 1, 2, 3]

이 때 1이 두 번 출력되지만 하나는 String인스턴스고, 다른 하나는 Integer인스턴스로 서로 다른 객체이다.

  • TreeSet

TreeSet은 이진 검색 트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스이다.

중복된 데이터의 저장을 허용하지 않으며, 정렬된 위치에 저장하므로 저장순서를 유지하지 않는다.

이진 검색 트리는 정렬, 검색, 범위검색에 높은 성능을 보이는 자료구조이다.

단 데이터를 저장할 때는 저장위치를 찾아서 저장해야하며, 삭제하는 경우에도 트리의 일부를 재구성해야하므로 효율이 떨어진다.

아래는 TreeSet의 메서드 목록이다.

clone()
복제해서 반환

NavigableSet descendingSet()
TreeSet에 저장된 요소들을 역순으로 정렬해서 반환

first()
정렬된 순서에서 첫 번째 객체 반환

last()
정렬된 순서에서 마지막 객체 반환

pollFirst()
첫 번째 객체 반환

pollLast()
마지막 객체 반환

floor()
지정된 객체와 같은 객체 반환, 없으면 작은 값을 가진 객체 중 제일 가까운 값의 객체 반환, 없으면 null

SortedSet headSet()
지정된 객체보다 작은 값의 객체들 반환

NavigableSet
headSet(element, inclusive)
지정된 객체보다 작은 값의 객체들 반환, inclusive가 true면 같은 값의 객체도 포함

higher()
지정된 객체보다 큰 값을 가진 객체 중 제일 가까운 값의 객체 반환, 없으면 null

lower()
지정된 객체보다 작은 값을 가진 객체 중 제일 가까운 값의 객체 반환, 없으면 null

Spliterator spliterator
spliterator반환

SortedSet subSet(from, to)
범위의 결과 반환(to는 포함x)

NavigableSet<E> 
subSet(E from, frominclusive, 
E to, toinclusive)
범위의 결과 반환(inclusive가 true면 각 요소 포함)

SortedSet tailSet()
지정된 객체보다 큰 값의 객체들을 반환

정리

  • 모든 노드는 최대 두 개의 자식 노드를 가질 수 있다.
  • 왼쪽 자식노드의 값은 부모노드보다 작고 오른쪽 자식노드는 커야한다.
  • 노드의 추가 삭제에 시간이 걸린다.
  • 검색과 정렬에 유리하다.
  • 중복된 값을 저장하지 못한다.

(4) Map

Map은 키(key)와 값(value)을 묶어서 하나의 데이터로 저장한다.

키는 저장된 값을 찾는데 사용되기에 중복되면 안된다.

그러나 값은 중복되어도 상관없다.

많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다.

  • HashMap
    HashMap은 키와 값을 각각 Object타입으로 저장한다.

아래는 HashMap의 메서드 목록이다.

clear()
Map의 모든 객체 삭제

boolean containsKey()
지정된 key객체와 일치하는 Map의 key객체가 있는 지 확인

boolean containsValue()
지정된 value객체와 일치하는 Map의 value객체가 있는 지 확인

entrySet()
Map에 저장되어 있는 key-value쌍을 map.entry타입의 객체로 저장한 Set으로 반환

boolean equals()
동일한 Map인지 비교

get(key)
지정한 key 객체에 대응하는 value객체를 찾아서 반환

hashcode()
해시코드 반환

boolean isEmpty()
Map이 비어있는지 확인

Set keySet()
Map에 저장된 모든 key객체 반환

put(key,value)
Map에 value객체를 key객체에 연결하여 저장

putAll()
지정된 Map의 모든 key-value쌍을 추가한다

remove(key)
지정한 key객체와 일치하는 key-value객체를 삭제

size()
Map에 저장된 key-value쌍의 개수를 반환

collection values()
Map에 저장된 모든 value객체 반환
  • TreeMap

이진검색트리의 형태로 키와 값이 쌍으로 이루어진 데이터를 저장한다.

검색과 정렬에 적합한 컬렉션 클래스이다.

다만 HashMap이 TreeMap보다 검색에서 더 뛰어나기 때문에 범위검색이나 정렬이 필요한 경우가 아니면 HashMap을 사용하는 게 좋다.

아래는 TreeMap의 메서드 목록이다.

Map.Entry ceilingEntry(key)
지정된 key와 일치하거나 큰 것 중 제일 작은 것의 키와 값의 쌍을 반환
없으면 null

ceilingKey(key)
지정된 key와 일치하거나 큰 것 중 제일 작은 것의 키를 반환
없으면 null

clone()
복제해서 반환

NavigableSet descendingKeySet()
TreeMap에 저장된 키를 역순으로 정렬해서 반환

firstKey()
저장된 첫 번째 (가장 작은) 키를 반환

Map.Entry floorEntry(key)
지정된 key와 일치하거나 작은 것 중에서 제일 큰 키의 쌍(Map.Entry)을 반환, 없으면 null

floorKey(key)
지정된 key와 일치하거나 작은 것 중에서 제일 큰 키를 반환, 없으면 null

SortedMap headMap(key)
저장된 첫 번째 요소부터 지정된 범위에 속한 모든 요소가 담긴 SortedMap을 반환(key는 미포함)

Navigable headMap(tokey,
 inclusive)
저장된 첫 번째 요소부터 지정된 범위에 속한 모든 요소가 담긴 SortedMap을 반환(inclusive가 true면 tokey도 포함)

Map.Entry higherEntry(key)
지정된 key보다 큰 키 중에서 제일 작은 키의 쌍(Map.Entry)반환, 없으면 null

Map.Entry lastEntry()
저장된 마지막 키의 쌍을 반환

lastKey()
저장된 마지막 키를 반환

Map.Entry lowerEntry(key)
지정된 key보다 작은 키 중에서 제일 큰 키의 쌍 반환,없으면 null

loweKey(key)
지정된 key보다 작은 키 중에서 제일 큰 키 반환,없으면 null

NavigableSet navigableSet()
모든 키가 담긴 NavigableSet을 반환

Map.Entry pollFirstEntry()
제일 작은 키를 제거하면서 반환

Map.Entry pollLastEntry()
제일 큰 키를 제거하면서 반환

replace(key,value)
지정된 키의 값을 지정된 객체로 대체

boolean replace(key, old value, new value)
지정된 키와 객체가 모두 일치하는 경우에만 새로운 객체로 대체

SortedMap subMap(from, to)
범위의 결과 반환(to는 포함x)

NavigableMap 
subMap(from, frominclusive, 
to, toinclusive)
범위의 결과 반환(inclusive가 true면 각 요소 포함)

SortedMap tailSet()
지정된 객체보다 큰 값의 객체들을 반환

TreeMap 구현 예제

TreeMap<String, String> list = new TreeMap<String, String>();
		
		String[] key = { "a", "b", "c", "d", "e" };
		String[] value = { "apple", "banana", "candy", "dog", "enum" };
		
		// 데이터 삽입
		for (int i = 0; i < key.length; i++)
			list.put(key[i], value[i]);

		System.out.println(list.ceilingEntry("A")); // "a=apple"
		System.out.println(list.ceilingKey("A"));   // "a"
		
		System.out.println(list.floorEntry("z"));   // "e=enum"
		System.out.println(list.floorKey("z"));     // "e“
	
		
		System.out.println(list.higherEntry("a"));  // "b=banana"
		System.out.println(list.higherKey("a"));    // "b"
		System.out.println(list.lowerEntry("e"));   // "d=dog"
		System.out.println(list.lowerKey("e"));     // "d“

TreeMap<String, String> list = new TreeMap<String, String>();
		
		String[] key = { "z","a", "b", "c", "d", "e" };
		String[] value = { "zip", "apple", "banana", "candy", "dog", "enum" };
		
		// 데이터 삽입
		for (int i = 0; i < key.length; i++)
			list.put(key[i], value[i]);

		System.out.println(list.lastEntry());   // "z=zip"
		System.out.println(list.lastKey());     // "z"
		System.out.println(list.firstEntry());  // "a=apple"
		System.out.println(list.firstKey());    // "a“

TreeMap<String, String> list = new TreeMap<String, String>();
		
		String[] key = { "z","a", "b", "c", "d", "e" };
		String[] value = { "zip", "apple", "banana", "candy", "dog", "enum" };
		
		// 데이터 삽입
		for (int i = 0; i < key.length; i++)
			list.put(key[i], value[i]);

		SortedMap<String, String> s = list.headMap("d");		
		System.out.println(s);  // {a=apple, b=banana, c=candy}
		
		SortedMap<String, String> s2 = list.headMap("d", true);
		System.out.println(s2); // {a=apple, b=banana, c=candy, d=dog}

SortedMap<String, String> s = list.tailMap("d");		
		System.out.println(s);  // {d=dog, e=enum, z=zip}
		
		SortedMap<String, String> s2 = list.tailMap("d", false);
		System.out.println(s2); // {e=enum, z=zip}

(5) Stack과 Queue

Stack

스택은 마지막에 저장한 데이터를 가장 먼저 꺼내게 되는 LIFO구조 이다.

스택은 한 방향으로만 뺄 수 있는 구조

스택에는 ArrayList와 같은 배열기반의 컬렉션 클래스가 적합하다.

스택은 다음과 같은 곳에서 사용된다.

  • 웹 브라우저 방문기록 (뒤로 가기) : 가장 나중에 열린 페이지부터 다시 보여준다.

  • 역순 문자열 만들기 : 가장 나중에 입력된 문자부터 출력한다.

  • 실행 취소 (undo) : 가장 나중에 실행된 것부터 실행을 취소한다.(ctrl + z)

  • 후위 표기법 계산
    수식의 괄호 검사 (연산자 우선순위 표현을 위한 괄호 검사)

아래는 스택의 메서드이다.

boolean empty()
stack이 비었는지 알려줌

peek()
stack 맨 위에 저장된 객체를 반환

pop()
stack 맨 위에 저장된 객체를 꺼낸다(stack에서 사라짐)

push()
객체 저장

search()
주어진 객체를 찾아서 그 위치를 반환, 못 찾으면 –1(배열과 달리 위치는 1부터 시작)

Queue

큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO구조로 되어 있다.

큐는 위아래로 뚫려 있어서 한 방향으로는 넣고 다른 방향으로는 빼는 구조(추가되는 방향에는 추가만, 빼는 방향에는 추출만 할 수 있다. 이를 개선한게 Deque)

큐는 데이터를 꺼낼 때 항상 첫 번째 저장된 데이터를 삭제하므로, 배열기반의 컬렉션 클래스(ArrayList)를 사용하면 데이터의 이동과 복사가 이뤄지기 때문에 비효율적이다.
그러므로 큐는 ArrayList보다 LinkedList로 구현하는 것이 더 적합하다.

큐는 주로 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용한다.

  • 우선순위가 같은 작업 예약 (프린터의 인쇄 대기열)

  • 은행 업무

  • 콜센터 고객 대기시간

  • 프로세스 관리

  • 촤근사용문서

  • 캐시(Cache) 구현

아래는 Queue에 사용되는 메서드 목록이다.

boolean add()
객체를 queue에 추가

remove()
객체를 꺼내 반환

element()
삭제없이 요소를 읽어옴, 비었을 때 noSuchElementException 반환

boolean offer()
객체를 저장, 성공하면 true, 실패하면 false를 반환

poll()
객체를 꺼내서 반환, 비어 있으면 null

peek()
삭제없이 요소를 읽어옴,비어 있으면 null

Stack과 Queue 구현 예제

Stack st = new Stack();

Queue q = new LinkedList(); //Queue인터페이스의 구현체인 LinkedLIST를 사용
       
        st.push("0");
        st.push("1");
        st.push("2");

        q.offer("0");
        q.offer("1");
        q.offer("2");

while(!st.empty()){
System.out.println(st.pop());
        } // 2, 1, 0 순서로 출력됨

while(!q.isEmpty()){
System.out.println(q.poll());
        } // 0, 1, 2 순서로 출력됨

주의할 점은
스택은 나중에 추가한 2를 먼저 출력하고, 큐는 먼저 추가한 0을 먼저 출력한다는 것이다.

또한 자바에서는 스택을 Stack클래스로 구현하여 제공하지만, 큐는 Queue인터페이스로 정의해 놓았을 뿐 별도의 클래스를 정의하고 있지 않다.
때문에 Queue인터페이스를 구현한 클래스들을 선택해서 사용해야 한다.

Deque
Queue의 변형으로, 한 쪽 끝으로만 추가/삭제할 수 있는 Queue와 달리, Deque는 양쪽 끝에 추가/삭제가 가능하다.

Deque 인터페이스를 구현한 클래스는 ArrayDeque, LinkedBlockingDeque, ConcurrentLinkedDeque, LinkedList 등이 있다.

(6) Iterator, ListIterator

Iterator와 ListIterator는 모두 컬렉션에 있는 인터페이스로 저장된 요소에 접근하는데 사용된다.
Enumeration(이전 버전)는 Iterator의 구버전이며, ListIterator는 Iterator의 향샹된 버전이다.

(1) Iterator
Collection인터페이스에는 Iterator를 반환하는 iterator() 메서드를 정의하고 있다.
List와 Set은 Collection인터페이스 자손이기에 사용할 수 있다.
주로 while문을 사용해서 요소들을 읽어온다.
아래는 iterator의 메서드이다.

boolean hasNext()
읽을 요소가 남아있는지 확인

next()
다음 요소를 읽어옴

remove()
next()로 읽어 온 요소 삭제
Collection c = new ArrayList<>(); // 다른 컬렉션으로 변경시 이 부분만 변경
        Iterator it = c.iterator();

        while(it.hasNext()){
            System.out.println(it.next());
        }

"new ArrayList<>()"를 ArrayList가 아닌 Collection인터페이스를 구현한 다른 컬렉션 클래스로 변경하면 사용가능하다.

"Collection c"처럼 참조변수 타입을 ArrayList가 아니라 Collection으로 하면 다른 클래스로 변경시에도 수정이 필요하지 않아 편리하다.

ex) ArrayList가 아닌 LinkedList로 변경시 "Collection c" 부분은 수정할 필요가 없다.

Map의 iterator()
Map인터페이스를 구현한 컬렉션 클래스는 키(key)와 값(value)을 쌍으로 저장하기 때문에 다른 방식으로 iterator()를 호출해야한다.

KeySet()이나 entrySet()으로 키와 값을 따로 Set형태로 얻어온 후에 다시 iterator()를 호출한다.

 Map map = new HashMap<>();
Iterator it = map.entrySet().iterator(); //값을 얻어옴

// "Iterator it = map.entrySet().iterator();"는
"Set s = map.entrySet();
Iterator it = s.iterator();" 를 한줄로 합친 것이다.

아래는 Map.entry인터페이스 메서드 목록이다.

boolean equals()
동일한 entry인지 비교

getKey()
key객체 반환

getValue()
value객체 반환

hashcode()
해시코드 반환

setValue()
value객체를 지정된 객체로 바꾼다.

(2) ListIterator()

ListIterator는 Iterator를 상속받아 기능을 추가한 것으로, Iterator가 단방향이라면 ListIterator는 양방향으로 이동이 가능하다.

단 ArrayList나 LinkedList같은 List인터페이스를 구현한 클래스에서만 사용할 수 있다.

boolean hasNext()
읽을 요소가 남아있는지 확인

boolean hasPrevious()
읽어올 이전 요소가 남아있는지 확인

next()
다음 요소를 읽어옴

previous()
이전 요소를 읽어옴

int nextIndex()
다음 요소의 index반환

int previousIndex()
이전 요소의 index반환

remove()
next()나 previous()로 읽어 온 요소 삭제

add()
새로운 객체 추가

set()
next()나 previous()로 읽어 온 요소를 지정된 객체로 변경

ListIterator() 구현 예제

 ArrayList c = new ArrayList<>();
 
			... // ArrayList c에 1,2,3,4,5를 삽입
            
ListIterator it = c.listIterator();

while(it.hasNext()){
 	System.out.println(it.next()); //순차적으로 출력 12345
        } 

while(it.hasPrevious()){
    System.out.println(it.previous()); //역으로 출력 54321
        }

컬렉션 프레임워크
스택과 큐

profile
쉽게 쉽게

0개의 댓글