KyungHwan's etc.

자바(JAVA) Iterator 인터페이스 본문

Java

자바(JAVA) Iterator 인터페이스

KyungHwan_0 2018. 6. 22. 14:59

자바(JAVA) Iterator 인터페이스

Iterator<E> 인터페이스

자바의 컬렉션 프레임워크는 컬렉션의 저장된 요소를 읽어오는 방법으로 Iterator 인터페이스로 표준화 하고있다.

컬렉션 프레임워크마다 데이터를 읽어오는 방법이 다를수 있다.

A개발자가 자신이 만든 데이터자료구조를 읽어오는 메소드 A.class를 정의하고, 사용하고,

B개발자가 또한 자신이 만든 데이터자료구조를 읽어오기 위해 메소드 B.class를 만들어 사용한다.

만약 두 개발자가 같이 협업을 하면서 각자의 데이터알고리즘을 서로 사용할때, 자신의 데이터자료구조 알고리즘이나 메소드를 서로에게 자세히 알려주지 않는다면 데이터를 읽어오는 메소드가 서로 다르기 때문에, 개발에 대한 협업이 어려울수가 있다.

이러한 문제점을 방지하기 위해서 자바에서는 Iterator 인터페이스 를 통해서 자바의 컬렉션프레임워크 는 Iterator 를 통해 가져오는 것을 권장하고, 표준화하고 있다.

Collection 인터페이스에서는 Iterator 인터페이스를 구현한 클래스의 인스턴스를 반환하는 iterator() 메소드를 정의하여 각 요소에 접근하도록 하고 있다.

따라서 Collection 인터페이스를 상속받는 List와 Set 인터페이스에서도 iterator() 메소드를 사용할 수 있다.

아래 예제는 iterator 를 사용하여 데이터를 읽어오고 있다.

LinkedList<Integer> lnkList = new LinkedList<Integer>();

lnkList.add(4);
lnkList.add(2);
lnkList.add(3);
lnkList.add(1);


Iterator<Integer> iter = lnkList.iterator();
while (iter.hasNext()) {
   System.out.print(iter.next() + " ");

}

실행결과
--------------------------------------------------
4 2 3 1

Iterator 인터페이스는 다음과 같은 메소드를 사용하여 컬렉션의 각 요소에 접근할 수 있다

메소드설명
boolean hasNext()해당 이터레이션(iteration)이 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함.
E next()이터레이션(iteration)의 다음 요소를 반환함.
default void remove()해당 반복자로 반환되는 마지막 요소를 현재 컬렉션에서 제거함. (선택적 기능)

하지만 현재 자바에서는 될 수 있으면 JDK 1.5부터 추가된 Enhanced for(for) 문을 사용하도록 권장하고 있다.

  1. 기존의 For Loop

for (카운트 변수 정의, 초기화 ; 조건문 ; 카운트 변수 증감)

for (int i = 0 ; i < 10 ; i++) {

// ...

}

  1. 향상된 For Loop

for (대입받을 변수 정의 : 배열)

: 배열 값이 대입받는 변수에 대입되어 For Loop의 Body 코드가 실행됨.

String[] arr = ["x", "y", "z", "1", "2", "3"]

for (String obj : arr) {

System.out.print(" " + obj);

}

실행 결과 
--------------------------------------------------
xyz123

Enhanced for 문을 사용하면 같은 성능을 유지하면서도 코드의 명확성을 확보하고 발생할 수 있는 버그를 예방해 줄수도 있다.

하지만 요소의 선택적 제거나 대체 등을 수행하기 위한 경우에는 반복자(iterator)를 사용해야만 한다.

ListIterator<E> 인터페이스

ListIterator 인터페이스는 Iterator 인터페이스를 상속받아 여러 기능을 추가한 인터페이스이다

Iterator 인터페이스는 컬렉션의 요소에 접근할 때 한 방향으로만 이동할 수 있다.

하지만 JDK 1.2부터 제공된 ListIterator 인터페이스는 컬렉션 요소의 대체, 추가 그리고 인덱스 검색 등을 위한 작업에서 양방향으로 이동하는 것을 지원한다.

단, ListIterator 인터페이스는 List 인터페이스를 구현한 List 컬렉션 클래스에서만 listIterator() 메소드를 통해 사용할 수 있다.

아래예제는 역순으로 리스트를 출력하는 예제이다.

LinkedList<Integer> lnkList = new LinkedList<Integer>();

lnkList.add(4);
lnkList.add(2);
lnkList.add(3);
lnkList.add(1);

ListIterator<Integer> iter = lnkList.listIterator();
while (iter.hasNext()) {
   System.out.print(iter.next() + " ");

}

while (iter.hasPrevious()) { //역순으로 데이터가 있는지 확인한다.
   System.out.print(iter.previous() + " "); //역순으로 가져온다
}

실행 결과
-----------------------------------------------------
4 2 3 1
1 3 2 4

ListIterator 인터페이스는 다음과 같은 메소드를 사용하여 컬렉션의 각 요소에 접근할 수 있다.

메소드설명
void add(E e)해당 리스트(list)에 전달된 요소를 추가함. (선택적 기능)
boolean hasNext()이 리스트 반복자가 해당 리스트를 순방향으로 순회할 때 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함.
boolean hasPrevious()이 리스트 반복자가 해당 리스트를 역방향으로 순회할 때 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함.
E next()리스트의 다음 요소를 반환하고, 커서(cursor)의 위치를 순방향으로 이동시킴.
int nextIndex()다음 next() 메소드를 호출하면 반환될 요소의 인덱스를 반환함.
E previous()리스트의 이전 요소를 반환하고, 커서(cursor)의 위치를 역방향으로 이동시킴.
int previousIndex()다음 previous() 메소드를 호출하면 반환될 요소의 인덱스를 반환함.
void remove()next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 리스트에서 제거함. (선택적 기능)
void set(E e)next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 전달된 객체로 대체함. (선택적 기능)

Reference

http://tcpschool.com/java/java_collectionFramework_iterator

'Java' 카테고리의 다른 글

Java로 카카오 REST API 호출 샘플 코드  (0) 2018.10.02
자바(JAVA) Sokect 통신  (0) 2018.06.22
자바(JAVA) 파일 입출력(I/O)  (0) 2018.06.22
자바 Map 컬렉션 클래스  (0) 2018.06.21
자바 List 컬렉션 클래스 (ArrayList)  (0) 2018.06.20
Comments