본문 바로가기
CS공부/자료구조

[Java] Iterator과 Iterable 그리고 iterator()을 알아보자(alaboza..)

by 반달bear 2022. 12. 2.
반응형

네이버 부스트코스의 자료구조를 수강하다 연결리스트의 반복자 선언 부분에 이르렀는데

또 막히는 부분이 생겼다

바로 iterator..

Public Iterator<E> iterator() {
	return new IteratorHelper();
}

라는 코드를 써놓고

IteratorHelper()에 해당하는 부분을 LinkedList 안에 만들어줘야 한단다.

public class LinkedList<E> implements ListI<E> {
	class IteratorHelper implements Iterator<E> {
    	...구현
    }
}

이렇게!

 

 

대충 해줘야 한다니까 음음 그렇군 하고 봤는데 코드를 다시 보니 이게 뭐지? 싶었다.

교수님은 Iterator<E> iterator() 파트를 Iterator인터페이스를 iterator로 구현해주는 코드라고 설명했는데

그럼 implements Iterator을 쓸 것이지 왜 이렇게 만들었지? 라는 의문이 생겼다.

간단하게 결론 먼저 말하자면 자료구조는 여러개가 있고

모든 자료구조의 Itorator 구현 방식이 다르기에 이렇게 선언할 수 밖에 없다.

 

 

그럼 이제부터 길게 풀어 써보도록 노력하겠다...^^

우선 Iterator<E> iterator() { return new IteratorHelper } 라는 코드를 보면

 1. iterator()은 Iterator 인터페이스를 반환한다.

2. iterator()은 새로 생긴 IteratorHelper을 리턴하는데 iterator()은 Iterator인터페이스를 반환하기에 IteratorHelper는 Iterator의 구현객체임을 짐작해볼 수 있다.

 

 

이제 LinkedList 안에 있는 IteratorHelper 코드를 보면 

LinkedList 안의 내부 클래스로 IteratorHelper implements Iterator<E>로

실제로 Iterator의 구현객체임을 확인할 수 있다. 

 

 

이 코드를 좀 더 자세히 그리고 실질적으로 이해해보기 위해 내가 만든 자료구조가 아닌 Collections 클래스를 살펴보자.

 

실제 코드를 살펴보면 Collection 인터페이스는 iterator을 추상메소드로 가진 Iterable 인터페이스를 상속하고

LinkedList를 포함한 다른 자료구조들은 Collection을 implement한다

그러니 실제로는 굳이 Iterator 인터페이스를 구현 객체로 리턴하지 않고

(public Iterator<E> iterator() {return new IteratorHelper();}

Collection안에 Iterator<E> iterator() 만 추상메소드로 가지니

자료구조들 (여기서는 LinkedList)안에 Iterator인터페이스를 구현하는 객체를 만들어주면 된다.

 

역시 실제로 어떻게 구현되있는지 살펴보면 이해가 좀 더 쉽고 간단해진다!

즉 인터페이스를 반환하는 메소드를 만든 이유는

 

자료구조들이 모두 가지고 있어야 하는 반복자를 만들어야 하는데,

그 반복자는 각 자료구조의 특성에 맞게 구현을 해야하니 

모든 자료구조를 포괄하는 인터페이스에 선언을 해주고

구현은 개별 자료구조에서 하는 식으로 코드를 만들어준 것이다!

 

 

사실 글을 쓰면서도 완벽한 이해를 했다고 하기엔 좀 부족하다 싶은데..😅 

모쪼록 보는 분들은 이해가 되셨으면 좋겠다...ㅎㅎ

혹은 아래의 사이트를 참고하면 될 것 같다!

 

 


참조

Iterator<E> 인터페이스, Iterator<E> 인터페이스에 정의된 메소드, '반복자' 사용 이유 (tistory.com)

[Java] Iterable 과 Iterator 이란? :: Gyun's 개발일지 (tistory.com)

 

반응형

댓글