Iterator : 반복하다, 순회하다
코틀린 공식문서
collection요소를 순회할 때,Kotlin standard library는 iterator 매커니즘-collection의 근본구조에 노출 되지 않고 요소를 순서대로 접근 할 수 있는 객체(그 collection이 list 인지 array인지 등을 알 필요가 없다는 뜻인듯?)-을 지원합니다.
Iterator은 collection의 모든 요소를 하나하나 처리하는 경우 유용합니다. (ex) 요소 하나하나를 모두 프린트 하거나, 비슷하게 업데이트 하는경우)
Iterator() 함수를 호출하여 Set 및 List를 포함한 Iterable 인터페이스의 상속자에 대해 Iterator를 얻을 수 있습니다.
iterator를 얻으면, collection의 첫 요소를 가르키고 있습니다. next() 함수는 첫요소를 반환하고 다음 요소가 존재하면, 다음 요소로 이동합니다.
iterator가 마지막 요소까지 가면, 더 이상 요소를 얻는데 사용 할 수 없습니다. 뒤로가기 및 이전요소로 가기를 할 수 없습니다. collection을 다시 순회하고 싶다면, 새로운 lterator을 만들어야 합니다.
val numbers = listOf("one", "two", "three", "four")
val numbersIterator = numbers.iterator()
while (numbersIterator.hasNext()) {
println(numbersIterator.next())
}
>>>
one
two
three
four
헷갈렸던 점 : 마지막 요소(four)은 뒷 값이 없어서 hasNext()가 false 일 텐데 어떻게 while문에 들어가서 실행이 되는지가 궁금했다.
해결 : hasNext()를
point가 가르키는 값(다음 단계에서 next()에 리턴될 값)이 있냐 (o)
hasNext()를 point 다음 값이 있냐(x)
로 해석하면 된다.
ex) next()로 3이 리턴되고 포인트가 4로 옮겨갔을 때,
hasNext()를 point 다음 값이 있냐 로 해석하면 false가 되서 while문에 안들어가게 되지만(내가 이렇게 생각해서 헷갈렸던 것임)
point가 가르키는 값(다음 단계에서 next()에 리턴될 값)이 있냐로 해석하면, next()로 4가 리턴될 것이기 때문에 true가 되서 while문을 타고 4가 리턴된다.