- Enumeration, Iterator, ListIterator는 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스입니다.
Enumeration은 Iterator의 구버전이며, ListIterator는 Iterator의 기능을 향상 시킨 것입니다. 자, 이제 하나씩 자세히 살펴보겠습니다.
1. Iterator 인터페이스
- Vector 컬렉션 클래스, ArrayList 컬렉션 클래스, LinkedList 컬렉션 클래스와 같이 요소가 순서대로 저장된 컬렉션에서 요소를 순차적으로 검색할 때는
java.util 패키지에 속한 Iterator 인터페이스를 사용하면 편리합니다.
- List인터페이스 뿐만 아니라, Set인터페이스를 구현한 컬렉션에도 사용 가능합니다. 다음은 Iterator인터페이스의 주요 메서드입니다.
<사진 1.1> Iterator인터페이스 메서드
- hasNext()메서드와 next()메서드는 Iterator의 핵심 메서드입니다.
- remove()메서드의 설명에 '선택적 기능'이란 Iterator인터페이스를 구현할 때 remove()메서드가 필수 기능이 아니므로 구현하지
않아도 괜찮다는 뜻 입니다.
- 다음은 ArrayList에 저장된 모든 요소들을 출력하기 위한 코드입니다.
1
2
3
4
5
6 |
List lit = new ArrayList();
Iterator it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
} |
cs |
<사진 1.2>
- ArrayList컬렉션 클래스 대신에 List인터페이스를 구현한 다른 컬렉션 클래스(Vector, LinkedList 등)에 대해서도 이와 동일한 코드를
사용할 수 있습니다. 첫 줄에서 ArrayList대신에 List인터페이스를 구현한 다른 컬렉션 클래스의 객체를 생성하도록 변경하기만 하면 됩니다.
** Map인터페이스는 Collection인터페이스의 자손이 아니므로 iterator()메서드가 존재하지 않습니다.
Map인터페이스를 구현한 컬렉션 클래스(HashMap, SortedMap 등)는 키(Key)와 값(Value)을 쌍(pair)으로 저장하고 있기 때문에
iterator()를 직접 호출할 수 없습니다. 그 대신 keySet()이나 entrySet()과 같은 반환 타입이 Set컬렉션인 메서드를 통해서
키와 값을 각각 따로 Set의 형태로 얻어 온 후에 Set컬렉션에는 iterator()가 존재하므로 iterator()를 호출하여 Iterator를 얻을 수 있습니다.
- 다음은 ArrayList에 있는 요소들을 Iterator를 사용하여 읽어 오는 코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 |
package com.edu.test;
import java.util.*;
public class test {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("1");
al.add("2");
al.add("3");
al.add("4");
al.add("5");
Iterator it = al.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
|
cs |
<사진 1.3>
다음은 결과 화면입니다.
<사진 1.3 결과 화면>
2. Enumeration 인터페이스
- Enumeration인터페이스는 컬렉션 프레임웍이 만들어지기 이전에 사용하던 것으로 Iterator의 구버전이라고 생각하면 됩니다.
이전 버전으로 작성된 소스와의 호환을 위해서 남겨 두고 있을 뿐이므로 가능하면 Enumeration대신 Iterator를 사용하도록 합시다.
- 다음은 Enumeration인터페이스의 메서드입니다. Enumeration은 Iterator와 메서드 이름만 다를 뿐 기능은 같습니다.
<사진 1.4> Enumeration인터페이스의 메서드
3. ListIterator 인터페이스
- ListIterator인터페이스는 Iterator를 상속받아서 기능을 추가한 것입니다. 컬렉션의 요소에 접근할 때 Iterator는 단방향으로만 이동할 수
있지만 ListIterator는 양방향으로 이동이 가능하다는 장점이 있습니다. 또한 ArrayList나 LinkedList처럼 List인터페이스를 구현한 컬렉션
클래스에서만 사용할 수 있습니다.
- 다음은 ListIterator인터페이스의 메서드입니다.
<사진 1.5> ListIterator인터페이스의 메서드
- 다음은 ListIterator인터페이스의 양방향 접근이 가능한 previous()메서드를 호출하여 이전 요소로 접근해보는 코드입니다.
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 |
package com.edu.test;
import java.util.*;
public class test {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("1");
al.add("2");
al.add("3");
al.add("4");
al.add("5");
ListIterator li = al.listIterator(); // 순방향으로 진행하면서 요소를 읽어옵니다.
while(li.hasNext()) {
System.out.println(li.next());
}
System.out.println("-----------");
while(li.hasPrevious()) { // 역방향으로 진행하면서 요소를 읽어옵니다.
System.out.println(li.previous());
}
}
} |
cs |
<사진 1.6> ListIterator인터페이스의 previous()메서드 사용
- Iterator인터페이스는 단방향으로만 이동하기 때문에 컬렉션의 마지막 요소에 다다르면 더 이상 사용할 수 없지만,
ListIterator인터페이스는 양방향으로 이동하기 때문에 각 요소간의 이동이 자유롭습니다. 다만 이동하기 전에 hasNext()메서드나
hasPrevious()메서드를 호출하여 이동할 수 있는지 확인해야합니다.
'언어 > JAVA' 카테고리의 다른 글
[Java] 클래스 / 인스턴스 / 지역변수 쉽게 이해하기 (0) | 2019.11.26 |
---|---|
[Java] 스캐너(Scanner)클래스 사용 방법 (0) | 2019.11.26 |
[JAVA] HashMap 컬렉션 클래스 사용 방법 (0) | 2018.03.28 |
[JAVA] Vector 클래스 사용 방법 (0) | 2018.03.21 |
[JAVA] ArrayList클래스 사용 방법 (0) | 2018.03.01 |