본문 바로가기
프로그래밍/JAVA

Iterator 패턴

by 낭만가을 2020. 2. 1.

1. iterator 패턴이란

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

2. 예제


// iterator 인터페이스를 만든다.
package com.designpattern.iterator;

public interface Iterator {
    boolean hasNext();
    Object next();
}

// NameRepository 클래스를 iterator 인터페이스를 이용하게 만든다.
package com.designpattern.iterator;

public class NameRepository {
    public String names[] = {"Robert","John","Julie","Lora"};
    public Iterator getIterator() {
        return new NameIterator();
    }

    private class NameIterator implements Iterator{
        int index;
        @Override
        public boolean hasNext() {
            if(index <names.length){
                return  true;
            }
            return  false;
        }

        @Override
        public Object next() {
            if(this.hasNext()){
                return names[index++];
            }
            return null;
        }
    }
}

// 테스트
package com.designpattern.iterator;

public class IteratorPatternDemo {
    public static  void main(String[] args){
        NameRepository nameRepository = new NameRepository();

        for(Iterator iter = nameRepository.getIterator();iter.hasNext();){
            String name = (String)iter.next();
            System.out.println("Name : " + name);
        }
    }
}


//결과
Name : Robert
Name : John
Name : Julie
Name : Lora

3. Iterator관련 interface
iterator  인터페이스를 만드는 대신에 구현되어 있는 java 의 iterable 인터페이스를 사용해도 됩니다.
private class NameIterator implements   Iterable {
위와같은 식으로 구현되어 있는걸 사용해도 되지만 iterator  패턴이 어떤건지 알기 위하여 구현을 임의로 한것입니다.

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 keySet()이라는 key를 Set으로 가져오기를 지원하고, value에 대해서는 Collection values() 를 제공합니다. 위에서 말씀드렸다시피 Set과 Collection은 둘다 Iterator를 제공합니다.

'프로그래밍 > JAVA' 카테고리의 다른 글

Template 패턴  (0) 2020.02.01
Builder 패턴  (0) 2020.02.01
Adapter 패턴  (0) 2020.02.01
Factory 패턴  (0) 2020.02.01
디자인패턴 종류별 간단 암기 노트  (0) 2020.01.30

댓글