Mathlife
Mathlife의 학습 노트
Mathlife
전체 방문자
오늘
어제
  • 분류 전체보기
    • CS
      • 알고리즘
      • 자료구조
      • 운영체제
      • 네트워크
      • 데이터베이스
    • 프로그래밍 언어
      • Java
      • JavaScript
      • C·C++
      • Python
    • Backend
      • Spring
    • Frontend
      • HTML
      • CSS
    • Math
      • Linear Algebra
      • Calculus
    • AI
      • ML
      • DL
      • RL
    • Git

블로그 메뉴

  • 홈
  • 관리
  • 글쓰기
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Mathlife

Mathlife의 학습 노트

프로그래밍 언어/Java

Iterable & Iterator

2022. 4. 11. 20:26

결론

클래스를 Iterable 하게 만들어 주고 싶다 $\Rightarrow$ 맞춤형 Iterator 객체를 만들어준다.  

 

Iterable

클래스(e.g. LinkedList<E>)가 Iterable<E> 인터페이스를 구현하면 public Iterator<E> iterator() 구현이 강제된다.

 

물론, 범용성을 위해 LinkedList<E>는 List<E> 인터페이스를 구현하고, List<E> 인터페이스가 Iterator<E>를 상속하는 구조가 더 좋은 것 같다.

 

iterator()는 for-each 문이나 Iterator<E> 객체를 통한 반복에 사용된다.

 

List<Integer> list = new LinkedList<Integer>();

for (Integer x : list) {
    ...
}

 

 

Iterator<Integer> iter = list.iterator();

while (iter.hasNext()) {
    Interger x = iter.next();
    ...
}

 

iterator()는 Iterator<E> 객체를 반환하도록 구현한다.

 

물론, 만드는 자료구조에 따라 반환하는 Iterator<E> 객체의 동작이 달라져야하므로 해당 자료구조를 위한 Iterator<E> 객체를 따로 만들어 반환해야 한다.

 

방법 1. (제일 직관적)

 

LinkedList 클래스 안에 MyIterator 내부 클래스를 만들어준다.

MyIterator는 Iterator<E> 인터페이스를 구현한다. 이로 인해 MyIterator는 Iterator<E> 타입으로 반환이 가능해진다.

iterator()는 MyIterator 객체를 반환한다.

 

public class LinkedList<E> implements List<E> {
    public Iterator<E> iterator(){
        return new MyIterator();
    }
    
    class MyIterator implements Iterator<E>{
        Node<E> index;

        public MyIterator() {
            index = head;
        }

        public boolean hasNext() {
            return index != null;
        }

        public E next() {
            if (!hasNext())
                throw new NoSuchElementException();
            E data = index.data;
            index = index.next;
            return data;
        }
    }
    
    ...
}

 

방법 2-1.

 

LinkedList<E> 자체가 Iterator<E> 인터페이스를 구현한다. 이로 인해 LinkedList<E>는 Iterator<E> 타입으로 반환이 가능해진다.

 

iterator()는 LinkedList<E> 객체를 반환한다. 

 

public class LinkedList<E> implements Iterable<E>, Iterator<E> {
    public Iterator<E> iterator(){
    	return this;
    }
        
    Node<E> index;

    public LinkedList() {
        index = head;
        ...
    }

    public boolean hasNext() {
        return index != null;
    }

    public E next() {
        if (!hasNext())
            throw new NoSuchElementException();
        E data = index.data;
        index = index.next;
        return data;
    }
    
    ...
}

 

방법 2-2.

 

List<E>가 Iterator<E> 인터페이스도 상속해 Iterator<E> 타입이 된다.

 

물론, LinkedList<E> 클래스는 List<E>를 구현하므로 Iterator<E> 역시 구현해야 한다.

 

public interface List<E> extends Iterable<E>, Iterator<E> {
	...
}

 

'프로그래밍 언어 > Java' 카테고리의 다른 글

인텔리제이 단축키  (0) 2022.05.31
제네릭  (0) 2022.04.14
음수 정수의 비트 표현  (0) 2022.04.13
모듈과 패키지  (0) 2022.04.10
Comparable vs Comparator  (0) 2022.04.08
    '프로그래밍 언어/Java' 카테고리의 다른 글
    • 제네릭
    • 음수 정수의 비트 표현
    • 모듈과 패키지
    • Comparable vs Comparator
    Mathlife
    Mathlife

    티스토리툴바