이 글은 유튜브 '자바의 정석 - 기초편'을 보고 정리한 글입니다.
📂content
1. Iterator, ListIterator, Enumeration
- 컬렉션에 저장된 데이터를 접근(읽어오기)하는데 사용되는 인터페이스
- Enumeration은 Iterator의 구버전
- ListIterator는 Iterator의 접근성을 향상시킨 것 (단방향 -> 양방향)
⚝ Iterator 인터페이스의 메서드
메서드 | 설명 |
boolean hasNext() | 읽어 올 요소가 남아있는지 확인. 있으면 true, 없으면 false 반환 |
Object next() | 다음 요소를 읽어온다. next()를 호출하기 전에 hasNext()를 호출해서 읽어 올 요소가 있는지 확인하는 것이 안전 |
void remove() | next()로 읽어 온 요소를 삭제. next()를 호출한 다음에 remove()를 호출해야 함.(선택적 기능) |
void forEachRemaining (Consumer<? super E> action) | 컬렉션에 남아있는 요소들에 대해 지정된 작업(action)을 수행. 람다식을 사용하는 디폴트 메서드 (JDK1.8부터 추가) |
- hasNext() (확인하기)와 next() (읽어오기)가 핵심!
- ListIterator은 Next와 Previous 모두 존재. List인터페이스를 구현한 Collection에서만 사용. 잘 안 쓰임
⚝ Enumeration 인터페이스의 메서드
메서드 | 설명 |
boolean hasMoreElements() | 읽어 올 요소가 남아있는지 확인. 있으면 true, 없으면 false 반환 Iterator의 hasNext()와 같다. |
Object nextElement() | 다음 요소를 읽어 온다. nextElement()를 호출하기 전에 hasMoreElements()를 호출해서 읽어올 요소가 남아있는지 확인하는 것이 안전. Iterator의 next()와 같다. |
Iterator은 왜 필요할까?
- 컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것
- 컬렉션에 iterator() 메소드를 호출해서 Iterator()를 구현한 객체를 얻어서 사용
List list = new ArrayList(); //다른 컬렉션으로 변경할 때는 이 부분만 고치면 된다.
Iterator it = list.iterator();
while(it.hasNext()){//boolean hasNext() 읽어올 요소가 있는지 확인
System.out.println(it.next()); //Object next() 다음 요소를 읽어옴
}
- Iterator라는 메소드는 Collection 인터페이스에 정의되어 있어서. Collection인터페이스의 자손인 List, Set이 모두 가지고 있는 메서드이다.
⍟실습
더보기
package etc;
import java.util.ArrayList;
import java.util.Iterator;
public class Ex11_5 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
Iterator it = list.iterator();
while (it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
//iterator은 1회용이라 다 쓰고 나면 다시 얻어와야 한다.
it = list.iterator();
while (it.hasNext()){
Object obj = it.next();
System.out.println(obj);
}
//아래 for문 같은 경우는 컬렉션은 ArrayList -> HashSet으로 바꾼다면 사용하지 못하는 코드이다.
//HashSet에는 get()이 없기 때문이다. 하지만 Iterator은 사용가능하다.
for(int i=0; i<list.size(); i++){
Object obj = list.get(i);
System.out.println(obj);
}
}//main
}
- `Collection c = new HashSet();`과 `Set c = new HashSet();`, `HashSet c = new HashSet();` 모두 가능하다.
하지만 참조변수를 Collection으로 할 경우 실제 구현클래스가 TreeSet()과 같은 경우로 바꿔야 할 때, 아래 코드들이 바뀌어도 상관이 없다. 그렇기 때문에 이러한 경우를 대비해 Collection을 사용하는 것이 좋다.
2. Map과 Iterator
- Map에는 iterator가 없다. `keySet()`, `entrySet()`, `values()`를 호출해야함.
keySet() -> Set, entrySet() -> Set, values -> Collection으로 한 번 받고 나서 iterator을 호출해야 한다.
//1
Set eSet = map.entrySet();
Iterator it = eSet.iterator();
//2
Map map = new HashMap();
...
Iterator it = map.entrySet().iterator(); //1번 코드를 한 줄로 합친 것
📣 comment
출처
'🎥Back > 자바의 정석' 카테고리의 다른 글
[JAVA의 정석]Comparator와 Comparable (0) | 2024.01.17 |
---|---|
[JAVA의 정석]Arrays (0) | 2024.01.17 |
[JAVA의 정석]Stack과 Queue의 활용 (0) | 2024.01.16 |
[JAVA의 정석]Stack과 Queue (0) | 2024.01.16 |
[JAVA의 정석]LinkedList (0) | 2024.01.16 |