[JAVA] 자바의 Iterable과 Iterator

2025. 7. 20. 17:09·자바

프로그래밍에서 데이터를 담는 그릇이 리스트(List)나 연결 리스트(LinkedList) 같은 자료구조라면, 그 안에 담긴 데이터를 하나씩 꺼내는 방법, 즉 순회(Iteration) 는 필수적인 기능이다.

 

그런데 자료구조마다 내부 구조가 다르기 때문에, 순회 방식도 달라질 수밖에 없다. 예를 들어, ArrayList는 인덱스를 기반으로 빠르게 접근할 수 있지만, LinkedList는 노드를 하나씩 따라가야 한다. 자바는 이런 구조 차이를 개발자가 직접 고려하지 않고도 일관된 방식으로 순회할 수 있도록 Iterable과 Iterator라는 표준 인터페이스를 제공한다.

 

 

1. Iterable과 Iterator는 왜 필요한가?

자바는 모든 컬렉션 객체가 공통된 방식으로 순회되기를 원했다. 그래서 List, Set, Queue 등 주요 컬렉션 클래스들이 Iterable 인터페이스를 구현하게 만들었다.
Iterable은 "이 객체는 반복할 수 있다"는 것을 나타내며, 실제 반복 동작은 Iterator가 수행한다.

 

2. Iterable – 반복 가능한 객체의 약속

public interface Iterable<T> {
    Iterator<T> iterator();
}

Iterable 인터페이스는 단 하나의 메서드 iterator()만 제공한다. 이 메서드를 통해 컬렉션은 반복자를 꺼낼 수 있게 된다.
그리고 이 인터페이스를 구현하면 자바의 향상된 for문(for-each)을 사용할 수 있다.
즉, Iterable을 구현하지 않으면 for-each 문법은 사용할 수 없다.

 

3. Iterator – 실제 순회를 수행하는 반복자

public interface Iterator<E> {
    boolean hasNext();
    E next();
}

 

Iterator는 순회를 위한 실질적인 작업자다.

  • hasNext()는 다음 요소가 있는지 확인하고,
  • next()는 그 요소를 반환하면서 커서를 다음 위치로 이동시킨다.

자료구조가 어떻게 구성되어 있든 간에, Iterator는 그 구조에 맞는 방식으로 데이터를 꺼내준다.

예를 들어 ArrayList는 배열 인덱스를 기반으로, LinkedList는 노드 연결을 따라가며 순회하게끔 iterator()를 구현해놓았다.

 

4. 향상된 for문은 Iterator를 자동으로 사용한다

다음과 같은 코드를 보자.

for (String item : list) {
    System.out.println(item);
}

이 문법은 for-each 또는 향상된 for문이라고 부른다.
자바 컴파일러는 위 코드를 아래와 같이 바꿔서 실행한다:

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String item = iterator.next();
    System.out.println(item);
}

즉, 우리가 보기에는 간단한 문법처럼 보여도, 내부에서는 hasNext()와 next()가 명확하게 호출되고 있다.
이는 list가 Iterable을 구현했기 때문에 가능한 것이다.

 

5. 직접 구현해보는 Iterable

아래는 우리가 직접 만든 클래스에 Iterable을 구현한 예시다:

class MyCollection implements Iterable<String> {
    private List<String> data = Arrays.asList("A", "B", "C");

    @Override
    public Iterator<String> iterator() {
        return data.iterator(); // 내부 컬렉션에 위임
    }
}

사용 방법은 다음과 같다:

MyCollection my = new MyCollection();

for (String s : my) {
    System.out.println(s);
}

MyCollection이 Iterable을 구현했기 때문에 for-each 문법을 사용할 수 있다. 이처럼 Iterable만 구현하면 모든 컬렉션처럼 자연스럽게 순회가 가능하다

 

마무리하며

자바의 Iterable과 Iterator는 단순한 문법 요소가 아니다. 서로 다른 자료구조들을 하나의 방식으로 순회하게 만드는 컬렉션의 공통 인터페이스이자 확장성의 핵심 구조다.

  • Iterable은 "반복 가능한 객체"라는 선언이고,
  • Iterator는 실제로 요소를 꺼내는 실행자이며,
  • for-each 문법은 이 구조를 기반으로 컴파일러가 자동으로 hasNext()와 next()를 호출하는 것에 불과하다.

이 구조를 정확히 이해하면, 자바의 컬렉션을 보다 자유롭고 효율적으로 다룰 수 있다.
자료구조가 달라도 반복 방식은 같다는 것 바로 이 점이 자바 컬렉션의 강력한 일관성과 확장성의 원리다.

 

감사합니다.

'자바' 카테고리의 다른 글

[JAVA] Comparable과 Comparator에 대하여  (3) 2025.07.20
[JAVA] Map 인터페이스에 대하여 (4)  (0) 2025.07.20
[JAVA] Set 인터페이스에 대하여 (3)  (1) 2025.07.20
[JAVA] List에 인터페이스에 대하여 (2)  (5) 2025.07.18
[JAVA] 배열의 단점과 ArrayList, LinkedList 비교 (1)  (4) 2025.07.17
'자바' 카테고리의 다른 글
  • [JAVA] Comparable과 Comparator에 대하여
  • [JAVA] Map 인터페이스에 대하여 (4)
  • [JAVA] Set 인터페이스에 대하여 (3)
  • [JAVA] List에 인터페이스에 대하여 (2)
0kingki_
0kingki_
자바 + 스프링 웹 개발
  • 0kingki_
    0kingki_
    0kingki_
  • 전체
    오늘
    어제
    • 분류 전체보기 (134)
      • 코딩 테스트 (54)
      • 자바 (21)
      • 스프링 (27)
      • 타임리프 (16)
      • 스프링 데이터 JPA (8)
      • 최적화 (2)
      • QueryDSL (4)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Java
    스프링 컨테이너
    spring
    SpringDataJpa
    mvc
    최적화
    재귀
    백준
    예외 처리
    다형성
    BFS
    fetch join
    스프링
    JPA
    dfs
    thymeleaf
    스프링 데이터 JPA
    LocalDateTime
    객체지향
    자바
    타임리프
    컬렉션
    쿼리
    불변객체
    QueryDSL
    코딩 테스트
    SOLID
    쿼리dsl
    코딩테스트
    예외처리
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
0kingki_
[JAVA] 자바의 Iterable과 Iterator
상단으로

티스토리툴바