전공/객체지향프로그래밍

[객체지향프로그래밍][Java] List 심화 내용(Iterator)

Campus Coder 2023. 6. 1. 18:42
728x90
반응형

List

자바 Collection의 계층 구도

 

 

Enhanced for문 사용

// list가 초기화 되어있다고 가정
for(String str: list) {
    System.out.println(str);
}

// 위쪽 코드와 같은 기능
for(Iterator<String> i = list.Iterator; i.hasNext(); ) {
    System.out.println(str);
}

 

Interface Iterable<T>

메소드 기능
Iterator<T> iterator() 타입<T>의 반복자 리턴

 

 

public interface ListIterator<E> extends Iterator<E>

메소드 기능
void add(E e) 리스트에 원소를 더함
boolean hasNext() 리스트 반복자가 가리킬 다음 원소가 있으면 true
boolean hasPrevious() 리스트 반복자가 가리킬 이전 원소가 있으면 true
E next() 리스트의 다음 원소를 리턴, 반복자는 다음 원소를 가리키게 됨
int nextIndex() 리스트의 다음 인덱스를 리턴, 반복자는 다음 원소를 가리키게 됨
E previous() 리스트의 이전 원소를 리턴, 반복자는 이전 원소를 가리키게 됨
int previousIndex() 리스트의 이전 인덱스를 리턴, 반복자는 이전 원소를 가리키게 됨
void remove() 마지막으로 리턴된 반복자가 가리키는 원소 삭제
void set(E e) 마지막으로 리턴된 반복자가 가리키는 원소 초기화

 

List<String> list = Arrays.asList("Apple", "Orange", "Mango", "Strawberry");
list = new ArrayList<>(list);
ListIterator<String> litr = list.listIterator();
litr.remove();

Exception in thread "main" java.lang.IllegalStateException

반복자가 생성되면 반복자의 커서는 리스트의 왼쪽을 가리킨다고 생각하면 됨

따라서, 생성 직후 remove 사용 시 예외 발생

 

import java.util.List;
import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Orange", "Mango", "Strawberry");
        list = new ArrayList<>(list);
        ListIterator<String> litr = list.listIterator();

        // forward
        while (litr.hasNext()) {
            String str = litr.next();
            System.out.print(str + '\t');
            if (str.equals("Orange"))
                litr.add("After_Orange");
        }
        System.out.println();

        // backwards
        while (litr.hasPrevious()) {
            String str = litr.previous();
            System.out.print(str + '\t');
            if (str.equals("Mango")) litr.add("Before_Mango");
        }
        System.out.println();

        for (String str : list)
            System.out.print(str + '\t');
        System.out.println();
    }
}
Apple Orange Mango Strawberry
Strawberry Mango Before_Mango After_Orange Orange Apple
Apple Orange After_Orange Before_Mango Mango Strawberry

 

반복자의 커서는 원소와 원소의 사이를 가리킨다고 생각하자

add()로 추가 시, 커서 위치와 커서의 왼쪽 원소 사이에 원소가 추가

따라서, 전방(오른쪽)으로 순회할 때에는 add()로 추가한 원소 출력 x

후방(왼쪽)으로 순회할 때에는 add()로 추가한 원소 출력 o

 

 

public static <T> List<T> asList(T... a)

List<String> list = Arrays.asList("Apple", "Orange", "Mango", "Strawberry");
list.add("Pear");
list.remove("Orange");

Exception in thread "main" java.lang.UnsupportedOperationException

asList는 고정 크기 목록을 반환하므로 add(), remove() 불가능

 

List<String> list = Arrays.asList(new String[]{"Apple", "Orange", "Mango", "Strawberry"});
String[] array = list.toArray(new String[0]);

Arrays.asList 메소드를 사용하여 문자열 배열을 List로 변환한 다음 toArray 메소드를 사용하여 다시 문자열 배열로 변환

이 경우 new String[0]은 지정된 배열로 전달되며, 이 배열의 길이가 List의 크기보다 작으므로 새 문자열 배열이 할당되어 반환

 

 

메소드 기능
static List asList(T... a) 지정된 배열에서 지원하는 고정 크기 목록을 반환
<T> T[] toArray(T[] a) 이 목록의 모든 요소를 포함하는 배열을 올바른 순서로 반환, 반환되는 배열의 유형은 지정된 배열의 유형

 

728x90
반응형