본문 바로가기
Language/Java

[Java API] Iterable, Iterator 인터페이스

by 클레어몬트 2024. 10. 25.

Java에서 Iterable과 Iterator는 컬렉션을 순회하기 위해 사용하는 두 가지 중요한 인터페이스이다. 이 두 인터페이스는 밀접하게 연관되어 있으며, 각각의 역할에 따라 순회를 수행한다. 이번 글에서는 Iterable과 Iterator의 차이점과 그 사용법에 대해 자세히 설명하겠다.

Map 인터페이스를 제외한 모든 Collection 프레임워크 인터페이스들은 Iterable 인터페이스를 상속받는다

 

1. Iterable 인터페이스

Iterable은 Java에서 반복 가능한 객체를 나타내는 인터페이스이다. Iterable을 구현한 클래스는 for-each문을 사용하여 요소를 순회할 수 있다. Java의 대부분의 컬렉션 클래스(List, Set, Queue 등)가 Iterable을 구현하고 있어, 이러한 클래스들은 손쉽게 for-each문으로 순회할 수 있다.

 

[주요 메서드]

- Iterator<T> iterator() : Iterable 인터페이스의 핵심 메서드로, 이를 통해 Iterator 객체를 반환한다. 이 메서드를 구현함으로써, 컬렉션 클래스는 반복 가능한 객체로 사용할 수 있게 된다.

import java.util.ArrayList;
import java.util.List;

public class IterableExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");

        // for-each 문을 사용하여 순회
        for (String item : list) {
            System.out.println(item);
        }
    }
}

 

위의 코드에서 list는 Iterable을 구현한 ArrayList이므로 for-each문을 통해 각 요소를 순회할 수 있다. for-each문 내부적으로는 Iterator를 사용하여 순회가 이루어진다.

 

2. Iterator 인터페이스

Iterator는 컬렉션의 요소를 순차적으로 접근하기 위한 인터페이스이다. Iterator는 Iterable이 제공한 컬렉션을 직접 탐색하며, 각 요소에 접근할 수 있는 방법을 제공한다. Iterator를 사용하면 컬렉션의 각 요소를 직접 제어하며 순회할 수 있다.

 

[주요 메서드]

- boolean hasNext() : 다음 요소가 있는지 확인한다. 요소가 남아 있으면 true, 아니면 false를 반환한다.

- T next() : 다음 요소를 반환하며, 현재 위치를 다음으로 이동시킨다.

- void remove() : 현재 Iterator가 가리키고 있는 요소를 제거한다. (선택적 메서드로, 모든 Iterator에서 반드시 구현해야 하는 것은 아니다)

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("apple");
        list.add("banana");
        list.add("cherry");

        // Iterator를 사용하여 순회
        Iterator<String> iter = list.iterator(); // iterator 객체를 얻는다
        while (iter.hasNext()) {
            String item = iter.next();
            System.out.println(item);
        }
    }
}

 

위의 코드에서 iterator() 메서드를 호출하여 Iterator 객체를 얻고, while 문을 사용해 hasNext()로 다음 요소가 있는지 확인하면서 next()를 통해 요소를 가져온다.

 

 

Iterable과 Iterator의 차이

ㅇIterable: 순회할 수 있는 객체를 의미하며, iterator() 메서드를 통해 iterator를 생성

for-each문을 사용하여 컬렉션을 간결하게 순회할 수 있다

 

ㅇIterator: 실제로 순회 작업을 수행하는 객체로, 컬렉션의 요소 하나씩 접근 가능

직접 요소를 순회하면서 특정 조건에 따라 요소를 제거하거나 순회 과정을 세밀하게 제어할 수 있다

 

Iterable과 Iterator는 Java에서 컬렉션을 순회하는 데에 있어 꽤나 중요한 역할을 한다. Iterable은 반복 가능한 객체를 의미하고, Iterator는 그 객체를 순회하며 요소를 가져오는 역할을 수행한다. 이 두 인터페이스를 적절히 활용하면 Java에서 컬렉션을 더욱 효율적이고 가독성 있게 다룰 수 있다. 따라서, 각 인터페이스의 특성과 사용 방법을 잘 이해하고 상황에 맞게 활용하는 것이 중요하다!

 

 

 

 

 

 

 

(참고) Iterator(반복자) 디자인 패턴

OOP에서 컬렉션의 요소들을 순회할  사용되는 디자인 패턴이다.  패턴은 컬렉션의 내부 표현 방식을 노출시키지 않으면서도  안의  요소에 순차적으로 접근할  있게 해준다. Iterator 패턴은 컬렉션의 구현과는 독립적으로 요소들을 탐색할  있는 방법을 제공하며, 이로 인해 코드의 복잡성을 줄이고 재사용성을 높일  있다.