일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 28 | 29 | 30 |
Tags
- Android
- androidstudio
- bitmap
- BOJ
- Canvas
- CS
- Database
- DBeaver
- DP
- Ecilpse
- Eclipse
- firebase
- git
- github
- GooglePlayServices
- gradle
- IDE
- IntelliJ
- java
- json
- kotlin
- level2
- linux
- mariadb
- MYSQL
- Paint
- permission
- python
- Sorting
- sourcetree
Archives
will come true
[Java] Enumeration, Iterator, ListIterator 차이 본문
728x90
Enumeration, Iterator, ListIterator는 모두 컬렉션에 저장된 요소에 접근하는 데 사용되는 인터페이스이다.
- Enumeration : Iterator의 구버전, 사용X
- Iterator : 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것
- ListIterator : Iterator에 양방향 조회기능 추가 (List인터페이스를 구현한 컬렉션에서만 사용 가능)
Iterator
Collection인터페이스 내에 선언된 iterator() 메서드는 'Iterator 인터페이스를 구현한 클래스의 인스턴스'를 반환한다.
public interface Iterator{
boolean hasNext();
Object next();
void remove();
}
public interface Collection {
...
public Iterator iterator();
...
}
메서드 | 설명 |
boolean hasNext() | 읽어 올 요소가 남아있는지 확인 |
<T> next() | 다음 요소를 읽어온다. |
void remove() | next()로 읽어 온 요소를 삭제 (next() 사용후에 호출해야 함) = 선택적 기능 |
List 혹은 Set은 이러한 Collection 인터페이스를 구현하고 있기 때문에 각 컬렉션에서 .iterator() 메서드를 호출할수 있으며, 그렇게 반환된 Iterator 인스턴스와 반복문을 사용해 컬렉션의 요소에 순차적으로 접근할 수 있다.
import java.util.ArrayList;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
ListIterator
Iterator는 단방향으로만 이동할 수 있으나, ListIterator는 양방향으로 이동 가능.
메서드 | 설명 |
(Iterator 인터페이스 메서드 포함) | |
void add(T e) | 컬렉션에 새로운 객체를 추가 |
boolean hasPrevious() | 읽어 올 이전 요소가 남아있는지 확인 |
T previous() | 이전 요소를 읽어온다 |
int nextIndex() | 다음 요소의 index 반환 |
int previousIndex() | 이전 요소의 index 반환 |
void remove() | next() 또는 previous()로 읽어온 요소 삭제 |
void set(T e) | next() 또는 previous()로 읽어 온 요소를 지정된 객체로 변경 |
ArrayList는 List인터페이스를 구현한 컬렉션이기 때문에 listIterator() 메서드가 존재하며 이를 통해 ListIterator 인스턴스를 반환받아 순차 / 역순으로 요소에 접근할 수 있다.
import java.util.ArrayList;
import java.util.ListIterator;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
ListIterator<Integer> it = list.listIterator();
// 순차 접근
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println();
// 역순 접근
while (it.hasPrevious()) {
System.out.println(it.previous());
}
}
}
remove() 메서드
Iterator 인터페이스의 remove() 메서드는 '선택적 기능'이라고 명시되어 있는데, 이는 Iterator 인터페이스를 구현하는 컬렉션 클래스에서 remove() 메서드를 반드시 구현한 필요는 없다는 뜻이다.
예를 들어 Iterator인터페이스를 구현하는 MyVector2라는 클래스를 선언한 뒤 [Implement methods] 를 선택하면, hasNext()와 next() 메서드만 기본 선택되어 있다. (필수로 구현해야되는 메서드들)
[참고]
- Java의 정석 3rd, 남궁 성, 도우출판
728x90
'Java' 카테고리의 다른 글
[Java] 이클립스 The selection cannot be launched, and there are no recent launches 에러 해결 (0) | 2023.04.27 |
---|---|
[Java] 이클립스 중단점(break point)에서 안멈추는거 해결 (0) | 2023.04.27 |
[Java] Collectors.toMap() 변환 시 IllegalStateException 에러 발생 이유 (0) | 2021.12.15 |
[Java] 서울-뉴욕간의 시차를 구하는 문제에서 뉴욕의 ZoneOffset이 '-05:00'가 아니라 '-04:00'로 나오는 이유 (0) | 2021.10.23 |
[Eclipse] Failed to Download Index 오류 해결 (0) | 2021.10.22 |
Comments