Java에서 제공하는 컬렉션은 보관하고 있는 자료들을 순차적으로 접근하면서 처리할 때 사용하는 Iterator 형식을 제공하고 있습니다. Iterator는 반복자라고 부르며 컬렉션 종류에 관계없이 같은 방법으로 프로그래밍 할 수 있게 해 줍니다.
Iterator 형식에는 다음 요소가 있는지 판별하는 hasNext 메서드와 다음으로 이동하는 next 메서드, 읽어 온 요소를 삭제하는 remove 메서드 등을 제공합니다.
public boolean hasNext(); public Object next(); public void remove();
Iterator 개체는 컬렉션 개체의 iterator 메서드를 호출하여 얻어올 수 있습니다. 그리고 hasNext 메서드로 이동이 가능한지 확인한 후에 next 메서드로 해당 위치의 보관한 개체를 참조하여 원하는 작업을 수행합니다.
Iterator<Member> seek = members.iterator(); Member member; while( seek.hasNext() ) { member = seek.next(); DoIt(member); }
만약에 next 메서드로 얻어온 개체를 컬렉션에서 제거하고 싶다면 remove 메서드를 사용하세요.
이와 같은 Iterator 개체를 사용하면 size 메서드를 얻어와서 반복 처리하는 것보다 속도에서 불리합니다. 이는 Iterator 개체를 사용하는 부분이 있기 때문에 불가피한 사항입니다. 하지만 컬렉션 종류에 관계없이 일관성있게 프로그래밍할 수 있다는 장점을 갖고 있습니다. 여러분의 코드에 어떠한 컬렉션을 사용할 지 정해지지 않았지만 컬렉션 내에 보관한 모든 내용을 출력하는 등의 작업을 먼저 하길 원한다면 Iterator를 사용하는 것은 좋은 선택입니다. 보다 자세한 사항은 디자인 패턴을 다루는 책에서 반복자 패턴을 참고하시기 바랍니다.
다음은 3.4에서 작성했던 회원 관리 프로그램에서 전체 목록 기능과 특정 번호의 회원을 찾는 기능을 Iterator를 이용하여 작성한 코드입니다.
▷ 소스 3.7 Iterator 사용 (Vector를 이용한 회원 관리 프로그램)
//Member.java //회원 클래스 public class Member { final int num; String name; public Member(int num, String name){ this.num = num; this.name = name; } public int getNum(){ return num; } public String toString(){ return String.format("번호:%d 이름:%s", num,name); } }
//MemberManager.java //회원 관리자 클래스 import java.util.Vector; import java.util.Scanner; import java.util.Iterator; public class MemberManager { Scanner scan = new Scanner(System.in); Vector<Member> members = new Vector<Member>(); public void Run(){ int key = 0; while((key = selectMenu())!=0){ switch(key){ case 1: addMember(); break; case 2: removeMember(); break; case 3: searchMember(); break; case 4: listMember(); break; default: System.out.println("잘못 선택하였습니다."); break; } } System.out.println("종료합니다..."); } int selectMenu(){ System.out.println("1:추가 2:삭제 3:검색 4:목록 0:종료"); int key = scan.nextInt(); scan.nextLine(); return key; } void addMember(){ int num = 0; String name=""; System.out.print("추가할 회원 번호:"); num = scan.nextInt(); scan.nextLine(); System.out.print("회원 이름:"); name = scan.nextLine(); Member member =new Member(num,name); members.add(member); System.out.println(member.toString()+" 생성하였습니다."); } void removeMember(){ int num = 0; System.out.print("삭제할 회원 번호:"); num = scan.nextInt(); scan.nextLine(); Member member = Find(num); if(member == null){ System.out.println("존재하지 않습니다."); return; } members.remove(member); System.out.println(member.toString()+" 삭제하였습니다."); } void searchMember(){ int num = 0; System.out.print("검색할 회원 번호:"); num = scan.nextInt(); scan.nextLine(); Member member = Find(num); if(member == null){ System.out.println("존재하지 않습니다."); return; } System.out.println("검색 결과>>"+member.toString()); } void listMember(){ System.out.println("전체 목록"); int cnt = members.size(); System.out.println("회원 수:"+cnt); Iterator<Member> seek = members.iterator(); Member member= null; while(seek.hasNext()){ member = seek.next(); System.out.println(member.toString()); } } Member Find(int num){ Iterator<Member> seek = members.iterator(); Member member= null; while(seek.hasNext()){ member = seek.next(); if(member.getNum() == num){ return member; } } return null; } }
//Program.java //Iterator 사용 (Vector를 이용한 회원 관리 프로그램) public class Program { public static void main(String[] args){ MemberManager mm = new MemberManager(); mm.Run(); } }
▷ 소스 3.7 실행 결과
1:추가 2:삭제 3:검색 4:목록 0:종료 1 추가할 회원 번호:4 회원 이름:홍길동 번호:4 이름:홍길동 생성하였습니다. 1:추가 2:삭제 3:검색 4:목록 0:종료 1 추가할 회원 번호:2 회원 이름:강감찬 번호:2 이름:강감찬 생성하였습니다. 1:추가 2:삭제 3:검색 4:목록 0:종료 1 추가할 회원 번호:6 회원 이름:을지문덕 번호:6 이름:을지문덕 생성하였습니다. 1:추가 2:삭제 3:검색 4:목록 0:종료 4 전체 목록 회원 수:3 번호:4 이름:홍길동 번호:2 이름:강감찬 번호:6 이름:을지문덕 1:추가 2:삭제 3:검색 4:목록 0:종료 0 종료합니다...