Java에는 for each문이 있습니다. 카운터 변수와 증감식을 사용하지 않는 for문인데요. 배열이나 Collections 등에서 쓸 수 있습니다. 이런 식으로 쓸 수 있습니다.

 

 

for(타입 변수: 순회할 Collection이나 배열 이름)

 

 

 더 정확히 말하면, iterable이 가능한 것만 노란색으로 칠한 것에 쓸 수 있습니다. 저는 이 문법을 설명하기 위해서 포스팅을 쓰지 않았습니다. arrayList에 for each 문을 쓰면 어떻게 동작하는지 알아보겠습니다.

 

 


 먼저, 초기화가 되어야 할 건데요. 우리는 ArrayList를 순회할 때, 인덱스를 줄 수도 있습니다. 하지만, 이터레이터를 줄 수도 있는데요. 여기서, iterator란, 어떠한 요소를 순회하기 위한 반복자 정도로 생각하시면 됩니다.

 

 

 12번째 줄에 F5를 타고 들어가 봅시다.

 

 

 그러면 왠 iterator를 새로 생성을 합니다. 이 안으로 따라 들어가 봅시다.

 

 

 그러면, 847번부터 849번까지 왠 변수들이 가득 있는 것을 볼 수 있는데요. 이 중 제일 중요할 거 같은 것은, cursor입니다. 이것은, 현재 iterator가 몇 번째 원소를 가리키고 있는지를 나타내는 변수입니다. 현재 아무것도 순회를 하지 않았습니다. 그 경우, cursor의 값은 0입니다.

 

 

 그런데 hashNext()로 다음 원소가 있는지를 검사해서, 1번째 원소를 보았습니다. 그리고 next()를 호출하는 경우, cursor의 값은 하나가 증가할 거에요. next 내부에서, cursor의 값을 하나 증가시키기 때문입니다.

 

 

 대략 이런 식일 겁니다. cursor 변수의 역할은 명확합니다.

 

 

 그러면, hasNext 함수에서는 cursor의 값이, arrayList의 크기인 size와 같은지만 검사하면 될 겁니다. 만약에, 두 값이 같으면, 더 이상 순회를 할 수 없으니까, false를 리턴하고, foreach 문이 끝나게 됩니다. 내부적으로, 반복문 안을 돌리는 조건을, 이 메서드로 판단합니다.

 

 


 그러면 문제의 next 함수는 무엇을 할까요?

 

 

 간단합니다. 단지, 다음 원소를 빼는 역할을 할 뿐입니다.

 

 

 변수 i에 cursor의 값을 넣습니다.

 

 

 그리고 cursor의 값을 하나 증가시킵니다. 그러면 현재 cursor의 값이 2였습니다. 그 상태에서, next가 호출이 되었다고 한다면, i도 1일 겁니다. 그러면 그림과 같이 상황이 그려질 겁니다.

 

 

 다음에, cursor의 값이, 하나 증가합니다.

 

 그러면 요렇게 그려 질 겁니다. 이 상태에서 elementData[i]를 리턴합니다. 즉, 2를 리턴하게 됩니다. 이 값을 타입 변수 항목에 넣습니다. for each문을 쓴 경우, 2가지만 기억하시면 좋아요. 처음부터 끝까지 순회한다는 것. 그리고, iterator 객체를 생성한다는 것.

 

 

[관련글]

반복자 무효화. 대체 무엇일까요?

 

 

 더 중요한 것은, 순회 도중 자료구조에 변형이 일어나면 안 된다는 것입니다. C++의 반복자 무효화에 대해서 언급할 때 이에 대해서 제가 글에서 언급을 해 드린 적이 있을 겁니다. 루틴을 도는 동안에 데이터에 변형이 있으면 곤란하다는 것이 주요 요지입니다.