제 홈페이지의 모든 글은 anti-nhn license에 따릅니다.



자바 디자인 패턴 1 - Iterator

1. iterator 패턴은..

프로그래밍을 하다 보면, array나 List, Set, Map과 같은 애들을 많이 씁니다. 얘네들의 특징은 어떤 데이터들의 집합체라는 겁니다. 원래 집합체란 게 속에 뭐가 들었냐가 중요하죠. 그래서 집합체들을 다룰 때는 얘들이 가지고 있는 개별 원소에 대해서 이런 저런 작업들을 할 일이 많습니다.
iterator를 쓰게 되면, 집합체와 개별 원소들간에 분리시켜 생각할 수가 있습니다. 심지어는 그 집합체가 어떤 클래스의 인스턴스인지 조차 신경쓰지 않아도 됩니다.

2. 예제

package c01_iterator;

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

public class MagicianList implements Iterable<String> {
 private List<String> list = new ArrayList<String>();
 
 public void add(String name){
  list.add(name);
 }
 
 public Iterator<String> iterator() {
  return 
new Iterator<String>(){
   int seq = 0;
   public boolean hasNext() {
    return  seq < list.size();
   }
   public String next() {
    return list.get(seq++);
   }
   public void remove() {
        throw new UnsupportedOperationException();
   }
  }
;

 }
 
 
 public static void main(String[] arg){
  MagicianList magicians = new MagicianList();
  magicians.add("이은결");
  magicians.add("Kevin parker");
  magicians.add("David Blaine");
  
  Iterator<String> iterator = magicians.iterator();
  while (iterator.hasNext()) {
   String element = iterator.next();
   System.out.println(element);
  }

 }
}

먼저, main 함수의 황토색 부분을 보면, magicians 의 원소들을 뽑아내는데, magicians 라는 변수를 전혀 쓰지 않습니다. 물론, 내부적으로 iterator라는 변수가 magicians와 관계를 유지해주고 있긴합니다만, 일단 iterator를 가지고 온 후에는 데이터 집합체가 뭐냐에 신경을 쓸 필요가 없어진 거죠. iterator만 가져오면, 걍 hasNext() , next() 만 가지고 반복하면서 원소들에 대해서 처리를 하면 됩니다.

3. Iterator관련 interface

소스 코드의 보라색 부분이 jdk 안에 있는 Iterator에 관한 부분입니다.
java.util.Iterable 이란 넘을 구현하고 있습니다. 고놈한테는 Iterator<E> iterator() 라는 메소드 한개만 있습니다. 뭔소리냐면, 이 클래스는 무슨무슨 집합체 데이터를 가꾸 있으니깐, iterator로 원소들을 뽑아다가 쓸 수 있도록 제공하겠다는거죠.

그담에 등장하는 것이 java.util.Iterator입니다. 소스 코드의 청록색 부분입니다.
method가 3개가 있죠? hasNext()는 다음 구성 요소가 있냐고 물어봅니다. next()는 그 요소를 뽑아옵니다. remove()는 일부러 구현을 안했습니다. API에 보면, 마지막으로 꺼낸 요소를 제거한다.(optional operation) 이라고 되어있습니다. optional이라는 걸 강조할라고 구현 안 했습니다.
요기서 한가지 짚고 넘어가야 할 것은 시퀀스는 hasNext()가 아니라 next()에서 증가시켜야 한다는 것입니다. 좀 비상식적인 얘기긴 합니다만, hasNext()를 호출하고 또 호출하는 일이 발생할 수도 있기 때문이죠. hasNext라는 메소드 이름이, next를 가지고 있는지를 체크하겠다는 것이니까요.

4. JAVA API에 있는 Iterator

우리가 알고 있는 일반적인 집합체들은 전부 Iterator를 제공합니다. Set, List 등은 Collection 을 상속 받는데, Collection이 Iteratable을 상속 받기 때문입니다.
위에서 청록색 부분을 list.iterator() 라고 쭐여버려도 됩니다. 걍 있는 거 안 쓰고 굳이 구현한 건 예제 파일을 함 보여줄라고 한 겁니다. 사실은 예제 전체가 억지로 만들어낸 겁니다. 일반적인 집합체를 구현해서 쓰는 일은 거의 없고, JDK 안에 들어 있는 애들을 가져다 쓰는데, 걔들은 거의 대부분 Iterator를 제공하거든요.(Map은 한 다리 건너서 제공합니다.) 그래서 Iterator를 직접 구현할 일은 거의 없습니다. 가져다가 쓸 일이 있을 뿐이죠.

이제 Map은 왜 Iterator를 제공하지 않는 지를 살펴보죠. Map은 Set이나 List와는 달리 key-value의 구조입니다. key에 대한 Iterator인지 value에 대한 Iterator인지 구별할 방법이 없죠. 그래서 아예 제공을 안 합니다. 그러나 Map에는 key에 대해서는 Set<K> keySet()이라는 key를 Set으로 가져오기를 지원하고, value에 대해서는 Collection<V> values() 를 제공합니다. 위에서 말씀드렸다시피 Set과 Collection은 둘다 Iterator를 제공합니다.

5. Enumeration vs Iterator

둘은 굉장히 유사합니다. Enumeration의 경우는 boolean hasMoreElements()E nextElement() 를 제공합니다. Iterator의 hasNext() , next() 에 대응되는 메쏘드들이죠.
차이는 두 가집니다. 첫째 Iterator에는 remove()가 있다. 둘째, Iterator의 함수 이름이 훨씬 쉽다.(타이핑 노가다가 쭐어든다.-_-; )
처음에 Enumeration이 나왔고, 그걸 쫌 편하게 만들어보자한 것이 Iterator랍니다.

by 삼실청년 | 2007/09/19 12:41 | 컴터질~ | 트랙백(1) | 핑백(3) | 덧글(40)

트랙백 주소 : http://iilii.egloos.com/tb/3788564
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from One is never.. at 2011/08/01 11:19

제목 : iterator 이해하기~!!
자바 디자인 패턴 1 - Iterator...more

Linked at 자바 디자인 패턴 1 &#82.. at 2012/07/12 13:07

... e Post navigation 자바 디자인 패턴 1 &#8211; Iterator Posted on 2012/07/12 by allnewangel 이 글은 삼실청년님의 블로그 글을 정리용으로 옮긴 내용입니다. 1. Iterator 패턴은.. 프로그래밍을 하다 보면, Array나 List, Set, Map과 같은 ... more

Linked at java design patt.. at 2017/05/31 09:25

... 1. 자바 디자인 패턴 1 – Iterator</A> 2. 자바 디자인 패턴 2 – Adapter 3. 자바 디자인 패턴 3 &#8211; Factory Method 4. 자바 디자인 패턴 4 &#8211; Template Method 5. 자바 디자인 패턴 5 – Singleton 6. 자바 디자인 패턴 6 – Strategy 7. 자바 디자인 패턴 7 – Composite 8. 자바 디자 ... more

Linked at 자바 디자인 패턴 종류 &#8.. at 2017/09/26 09:15

... d,Network,Mybatis,Spring, 자바 디자인 패턴 종류 2017-09-26 by user&middot;0 Comments 1. 자바 디자인 패턴 1 – Iterator 2. 자바 디자인 패턴 2 – Adapter 3. 자바 디자인 패턴 3 &#8211; Factory Method 4. 자바 디자 ... more

Commented by 삽질소년 at 2008/09/02 13:34
Iterator패턴을 알아보다가 다른 페이지나 블로그 내용은 이해가 잘 안되었었는데...

이글을 보니, 한번에 알겠네요..^^

즐겨찾기 추가하고 자주 들를께요...ㅎㅎ
Commented by 삼실청년 at 2008/09/02 19:23
저두 이걸 뭐에 쓰나 몇 번이나 뒤적거렸었죠. 알고 나니 대단한 거 아닌데 알기가 생각보다 어렵더군요.
네이버에 퍼가는 것만 빼고는 무엇에 쓰시건 상관없습니다. 특히 모르는 사람 앞에서 아는 척하는 용도로 쓰면 바람직합니다.ㅋㅋㅋ
Commented by 들개 at 2009/04/30 16:48
굉장히 깊이있게 아시는것 같아요. 하나씩 열독중입니다.
이런 가치있는 정보를 얻게되어 정말 운좋은것 같구요.
고맙고 또 고맙습니다.
Commented by 지송 at 2009/05/14 15:02
전 C# 하고 있지만 글이 이해하기 쉽게 써놓으셔서 좀더 보기 편하네요.

잘보고 갑니다.

Commented by 삼실청년 at 2009/05/19 20:47
최대한 쉽게 쓸라고 합니다. 사실은 저도 아는 게 없어서 어렵게 못 씁니다.^^
Commented by heyjae at 2009/10/08 03:57
사내 자바 교육을 위해 자료들을 찾다가 우연히 님의 블로그에 왔습니다.
꼭 필요한 내용이지만 설명하기엔 쉽지 않고 저 스스로도 정리가 안되는 부분이 있었는데, 큰 도움이 되었습니다.
감사드리고 님의 블로그에 있는 기술자료들을 활용하고자 하여 글을 남깁니다.
물론 anti-nhn license정책은 준수합니다. ^^ 감사합니다.
Commented by 삼실청년 at 2009/11/02 15:59
크하하~ 쓸만하셨다니 고맙습니다. 그런 의미에서 알바 자리라도 하나 주세요.ㅜㅜ.
먹고 살기 힘들어졌습니다~
자바, 웹싸이트 개발 할 줄 압니다. 그 외 그거 가르치는 것도 할 줄 압니다.
재택 알바 및 주말을 이용한 출장 알바 가능합니다~~
어흑흑~
요즘 상태 메롱스럽네요.ㅋㅋ
Commented by 운래손 at 2009/12/11 16:03
우아..평소에 궁금했던 내용을 알기쉽게 설명하셨네요
공부에 많은 도움이 되었습니다.
Commented by 삼실청년 at 2009/12/16 13:26
방문해주셔서 감사합니다.^^
Commented by 이승은 at 2010/01/06 10:00
안녕하세요 ani-nhn 라이센스라고 써있긴 하지만.. 검색을 하다보니 찾게 되었네요...
정말 너무 좋은 글을 읽게 되어서 감사드립니다...
책에는 없는 부분까지 섬세하게 더 설명해주시니 정말 너무 고마울 따름입니다.^^
Commented by 삼실청년 at 2010/01/06 12:33
하핫. 허접한 글 칭찬해주셔서 고맙습니다^^
좋은 하루 되세요^^
Commented by zeros at 2010/01/19 14:53
좋은글이네요 ^^ 디자인패턴에 대해서 찾아보고 있었는데 감사합니다
Commented by 삼실청년 at 2010/01/22 10:08
반 정도 밖에 정리 못하고 딴일에 치어서 바쁘네요.
장차 시간이 되면, 차근차근 나머지도 정리할께요^^
찾아와주셔서 고맙습니다.
Commented by totored at 2010/07/22 16:55
블러그 보면서 많이 공부 하고 있습니다. 감사합니다.

내용 스크랩해 가겠습니다^^
Commented by 삼실청년 at 2010/09/03 15:31
넹~~ ^^
이라고 대답하기엔 참 오랜 시간이 지났군요.
어쩌다가 이리 관리 안 되는 블로그가 되었나....ㅜㅜ
알찬 내용 좀 찾아서 정리 좀 해야겠네요..
완전 유령의 집이 되어가네요..
Commented by ryukato at 2010/12/08 23:39
좋은 글 출/퇴근시에 자주 보고 있습니다. 전에 개발일 찔끔하고 지금은 Web tester를하고 있지만 개발이 왠지 더 매력있고 하고 싶어 틈내고 공부하고 있내요.
블로그 보며 많은 정보 얻어갑니다. ^^
Commented by 삼실청년 at 2010/12/17 21:57
하고 싶어 공부하시면 할 수 있을 겁니다.
세상의 기회라는 것은 그런 식으로 오는 것 같아요.
스티브 잡스의 스탠포드 졸업 축사 보니 기회는 생각치도 못한 곳에서 날라온대요ㅋ.
Commented by 달팽이 at 2012/02/26 15:12
디자인 패턴 자료를 찾다가 방문하게 되었습니다.

알찬자료가 많네요~

감사히 잘 보도록 하겠습니다.
Commented by 삼실청년 at 2012/03/21 20:28
^^ 도움이 되셨길 바래요..
Commented by 다니엘 at 2012/06/05 11:16
잘 보고 갑니다.. 도움이 많이 되겠네요.. 자주 들릴께요~
Commented by 삼실청년 at 2012/06/16 23:44
도움이 많이 되었으면 좋겠네요^^ 감사합니다.
Commented at 2012/08/20 14:19
비공개 덧글입니다.
Commented by 지금달리는청년 at 2012/10/28 14:50
원래 댓글 같은거 안남기는데 정말 많은 도움 되어서 이렇게

글 남깁니다.
Commented by 삼실청년 at 2012/11/19 17:01
진짜로 도움이 되셨으면 좋겠어요^^

코털만치라도 좋은 세상 만드는 글이 되었으면 싶어요. 감사합니다.
Commented by 고등어 at 2012/10/30 12:43
정말 감사합니다. 한눈에 이해하기 쉬운 그런 자료가 정말 많네요 ^^
Commented by 삼실청년 at 2012/11/19 20:59
색감이 남달라서 남의 눈 피곤하게 하는 거 아닌가 모르겠습니다...
색채 디자인을 배워야 될려나....

Commented by 손수만든떡밥 at 2013/01/03 14:47
패턴자료를 찾던중 삼실청년님의 블로그로 온게 정말 행운이라고 생각합니다.

자료정리도 잘되어있을 뿐더러 알기쉽게 설명을 해주시니 더할나위없이

좋은것 같습니다. 즐겨찾기 필수 요소로 등록해두었어요 감사해요 ^^
Commented by 삼실청년 at 2013/05/06 05:58
캬캬캬~
주인장이 버린 곳이에요... 걍 있는 거라도 보시겠다면.. 고맙습니다. 도움이 되길 바래요^^
Commented by 시원한맛 at 2013/04/04 15:27
공부 잘했습니다 종종 들려서 정보좀 얻어갈게여^^
Commented by 삼실청년 at 2013/05/06 05:59
네네~ 아무나 보시라~~ 고 열어놓은 곳입니다. 누가 보는 게 좀 부끄럽긴 합니다만ㅎㅎ
Commented by 복통 at 2013/05/09 10:51
내공이 장난 아니신듯...난해한 부분을 이렇게 정리하실수 있다니...
좋은정보 감사합니다.
Commented by 삼실청년 at 2013/05/21 20:44
좋은 정보이길 바래요~^^
Commented by 간달퐁 at 2013/06/20 08:25
오래전에 쓰신글이네요... 지금은 더 실력이 상승하셨겠네요... 많이 배우고갑니다.
Commented by 삼실청년 at 2013/07/07 07:05
도움이 되셨길 바래요.^^
Commented by saber 세이버 at 2013/07/05 19:55
디자인 패턴 으로 검색을 왔는데.. 쉬운 설명 너무 좋습니다.
디자인패턴 익숙해질때까지..
Commented by 삼실청년 at 2013/07/07 07:08
혹시나 디자인패턴이 잘 이해가 안 가신다면 OOP 를 제대로 공부하시고 디자인 패턴 공부하세요.
저는 OOP 제대로 공부 안하고 디자인 패턴 공부한다고 쓸데없이 시간을 많이 날려 먹었습니다.(굉장히 많이 날려 먹었습니다.)
대부분의 디자인 패턴은 OOP만 잘 공부해 놓으면 설렁설렁 봐도 대충 이해갑니다. 건승하시길~~
Commented at 2014/01/16 15:20
비공개 덧글입니다.
Commented by 삼실청년 at 2014/01/24 00:44
라이센스만 준수해주세요~^^
도움이 되셨길 바래요.
Commented by 안녕하세요 at 2014/08/20 13:54
담아갈게요~
Commented by 삼실청년 at 2015/01/22 21:06
네넹~^^

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶