자바 Iterator 구현 | 자바 입문강좌 46

자바 Iterator 구현

Iteration Iterator 는 영어를 좀 하는 사람도 처음 들어봤을 법한 단어입니다.

일상적으로 사용하는 용어는 아닌 것 같습니다.

Iteration 은 같은 프로시저를 여러번 반복하는 것을 의미합니다. loop 반복문과도 함께 쓰이기도 따로 쓰이기도 합니다. 이렇게 좀 어려운 듯한 단어가 나왔을 때 지래 겁먹지 말고 영어사전에 검색을 하는 습관을 가져야 합니다.

옛날 사람들 이야기 하면 다소 시시콜콜하지만 컴퓨터의 발전이 가져다준 혜택은 확실히 20만년 살아온 사피엔스의 뇌를 끓임없이 업그레이드 하고 있습니다. 불과 한 10년 전만 해도 전자 사전이라는 제품을 들고 다니던 사람들이 있었습니다. 아이폰과 안드로이드폰이 나온 이후 역사의 뒤안길로 갔죠.

그런데 제품과 재고들이 많았는지 10년이 지난 지금도 쿠팡에서 전자사전을 팔고 있습니다. 어떻게 보면 이것도 대단한 일이죠. 10년전 유행하는 상품을 지금도 저렴하게 구할 수 있다는 부분.

컴퓨터 프로그래밍을 잘하기 위해서 또 컴퓨터 전반에 관한 이해를 높이기 위해서 영어는 필수입니다. 선택이 아니라 필수입니다. 간혹 영어하기가 싫어서 자기는 번역 기술이 좋아질 때까지 존버한다는 분도 계시는데 저는 그래도 영어를 공부하는게 더 좋다고 말합니다.

영어를 잘 해야하는 것은 단순히 기계적 번역을 얻기 위함이 아니라, 영어권 문화를 이해함으로써 컴퓨터의 설계자들의 철학과 생각에 더 가깝게 다가가기 위해서입니다. 아 물론 영어를 잘하면 훨씬 빨리 프로그래밍 스킬을 습득할 수 있겠죠. 그건 1차적인 부분이고 거기까지 도달하는 것도 쉽지 않고 또 만족할 만한 수준이긴 합니다.

조금더 열성을 가지면 자연스럽게 영어를 공부하게 됩니다. 어차피 영어로 프로그래밍 동영상을 많이 보다 보면 거의 비슷한 말로 설명하니까 시간이 지날 수록 익숙하게 됩니다. 번역기야 요새는 많이 있기 때문에 함께 도움을 받으면 그렇게 어렵지 않습니다.

잡설은 이정도로 하고 Iterator 를 사용해 보겠습니다. Iterator 는 인덱스가 없는 컬렉션에 사용합니다. 즉 for 문에서 i 인덱스로 돌릴 수 없는 Set 등에 사용할 수 있습니다. 물론 인덱스가 있는 컬렉션도 사용가능하니까요. 언제 필요한지 파악할 능력을 기르도록 합니다.

Iterator 예제

아래는 Iterator 의 예제입니다.

Collection 이 구현된 클래스에서 사용가능합니다. 여기서는 ArrayList 와 함께 사용합니다.

ArrayList 의 인스턴스의 iterator 메소드로 Iterator 제네릭으로 사용합니다. 뭔 말인지 헷갈리기 쉬운데 그냥 사용규칙입니다. while 문을 보면 iterator 가 새로 인스턴스를 생성하는 것은 아니고 참조를 다 받아옵니다. 그 참조를 원래 제네릭 객체 타입에 전달하므로 반복할 수 있는 것입니다. 여기서 next() 메소드를 사용하면 현재 요소를 반환하고 그 다음 요소로 하나 카운터를 이동시켜서 연달아 next() 호출하는 방식으로 전체 루프를 돕니다.

복잡해 보이지만 결국 Iterator 가 하는 것은 next() 입니다. hasNext() 는 boolean 형으로 다음에 요소가 있을 때 true 를 반환합니다.

package com.kay;


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

public class Main {
    public static void main(String[] args) {

        ArrayList<MyMemo> memList = new ArrayList<>();

        memList.add(new MyMemo(101, "Text and Memo"));
        memList.add(new MyMemo(102, "Iteration"));
        memList.add(new MyMemo(103, "And Collection"));

        Iterator<MyMemo> irt = memList.iterator();
        System.out.println(irt.hasNext());

        while(irt.hasNext()){
            MyMemo m1 = irt.next();
            m1.showMemo();
        }
    }
}

class MyMemo{
    private int memoId;
    private String memoText;

    public MyMemo(int memoId, String memoText) {
        this.memoId = memoId;
        this.memoText = memoText;
    }
    public void showMemo(){
        System.out.print("[this memo] = " + this.toString() + ", ");
        System.out.print("[memoId] = " + memoId + ", ");
        System.out.print("[memoText] = " + memoText);
        System.out.println();
    }
}
true
[this memo] = com.kay.MyMemo@7ef20235, [memoId] = 101, [memoText] = Text and Memo
[this memo] = com.kay.MyMemo@27973e9b, [memoId] = 102, [memoText] = Iteration
[this memo] = com.kay.MyMemo@312b1dae, [memoId] = 103, [memoText] = And Collection

실행 결과를 보면 제대로 반복한 것을 알 수 있습니다

요약

자바 Iterator 구현을 알아봤습니다. Collection 을 상속한 자료구조에서는 사용할 수 있으므로 필요할 때 유용하게 사용할 수 있습니다.

외부참고문서

Java – How to Use Iterator? – Tutorialspoint

Java Iterator (w3schools.com)

A Guide to Iterator in Java | Baeldung

자바 Iterator 구현 , ArrayList | 컬렉션 프레임워크

Leave a Comment