조용한 담장

코틀린(Kotlin) Collections : Iterators 본문

kotlin

코틀린(Kotlin) Collections : Iterators

iosroid 2020. 1. 2. 18:10

코틀린(kotlin) 의 반복자(iterator) 에 대해 살펴보자.

원문 https://kotlinlang.org/docs/reference/iterators.html 을 보며 정리.

 

iterator 는 SetList 를 포함해 Iterable<T> interface 의 상속자들로 부터 얻을 수 있으며 iterator() 함수 호출로 이 동작이 이루어 진다.

얻은 iterator 는 첫번째 element 를 가리키고 마지막 element 까지 이동할 수 있으며 마지막에 도달하면 다시 사용할 수 없으므로 새로 iterator 를 얻어야 한다.

val numbers = listOf("one", "two", "three", "four")
val numbersIterator = numbers.iterator()
while (numbersIterator.hasNext()) {
    println(numbersIterator.next())
}

// output:
// one
// two
// three
// four

for 를 사용하는 방법

val numbers = listOf("one", "two", "three", "four")
for (item in numbers) {
    println(item)
}

forEach() 를 사용하는 방법

val numbers = listOf("one", "two", "three", "four")
numbers.forEach {
    println(it)
}

List iterators

List 를 위한 iterator 는 LIstIterator 가 있다.

List 의 양방향 모두 이동이 가능한데 hasPrevious()previous() 을 통해 거꾸로 이동이 가능하다.

nextIndex() 와 previousIndex() 를 통해 인덱스 기반 element 정보를 얻을 수 있다.

val numbers = listOf("one", "two", "three", "four")
val listIterator = numbers.listIterator()
while (listIterator.hasNext()) listIterator.next()
println("Iterating backwards:")
while (listIterator.hasPrevious()) {
    print("Index: ${listIterator.previousIndex()}")
    println(", value: ${listIterator.previous()}")
}

// output:
// Iterating backwards:
// Index: 3, value: four
// Index: 2, value: three
// Index: 1, value: two
// Index: 0, value: one

iterator 를 양방향으로 쓸 수 있다는 것은 마지막 element 에 도달해도 다시 사용할 수 있다는 의미가 된다.

Mutable iterators

Mutable collections 의 경우 remove() 를 가지고 있는 MutableIterator 을 사용한다.

val numbers = mutableListOf("one", "two", "three", "four") 
val mutableIterator = numbers.iterator()

mutableIterator.next()
mutableIterator.remove()    
println("After removal: $numbers")

// output:
// After removal: [two, three, four]

MutableListIterator 을 사용하면 element 삽입, 대체 동작을 할 수 있다.

val numbers = mutableListOf("one", "four", "four") 
val mutableListIterator = numbers.listIterator()

mutableListIterator.next()
mutableListIterator.add("two")
mutableListIterator.next()
mutableListIterator.set("three")   
println(numbers)

// output:
// [one, two, three, four]

 

Comments