Iterator

나고수·2022년 3월 19일
0

1일1공부

목록 보기
18/68

Iterator : 반복하다, 순회하다
코틀린 공식문서

collection요소를 순회할 때,Kotlin standard library는 iterator 매커니즘-collection의 근본구조에 노출 되지 않고 요소를 순서대로 접근 할 수 있는 객체(그 collection이 list 인지 array인지 등을 알 필요가 없다는 뜻인듯?)-을 지원합니다.

Iterator은 collection의 모든 요소를 하나하나 처리하는 경우 유용합니다. (ex) 요소 하나하나를 모두 프린트 하거나, 비슷하게 업데이트 하는경우)

Iterator() 함수를 호출하여 Set 및 List를 포함한 Iterable 인터페이스의 상속자에 대해 Iterator를 얻을 수 있습니다.
collection interface hierarchy

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가 리턴된다.

profile
되고싶다

0개의 댓글