20231229 TIL

JaeYeong·2023년 12월 29일

Iterator

정의

간략하게 표현하면, 자료구조를 반복하기 위한 도구라고 이해하면 될 듯하다.
코틀린 뿐 아니라 다른 프로그래밍 언어에서도 컬렉션들에는 반복할 수 있는 기능이 포함되어 있다.
코틀린의 자료구조 중 하나인 set을 살펴보자. 다음은 Sets.kt 파일의 일부인데

internal object EmptySet : Set<Nothing>, Serializable {
    private const val serialVersionUID: Long = 3406603774387020532

    override fun equals(other: Any?): Boolean = other is Set<*> && other.isEmpty()
    override fun hashCode(): Int = 0
    override fun toString(): String = "[]"

    override val size: Int get() = 0
    override fun isEmpty(): Boolean = true
    override fun contains(element: Nothing): Boolean = false
    override fun containsAll(elements: Collection<Nothing>): Boolean = elements.isEmpty()

    override fun iterator(): Iterator<Nothing> = EmptyIterator

    private fun readResolve(): Any = EmptySet
}

fun iterator() 가 포함되어 있는 것을 볼 수 있다.

이를 바꿔 말하면, fun iterator()가 포함되지 않은 클래스는 반복이 불가능하다는 이야기가 된다.

반복이 가능하게 하려면?

fun iterator()를 넣어주면 된다. 다만 커스텀 iterator 메소드에는 규칙이 있는데 코드로 살펴보면

class Animal(val name: String)
class Zoo(val animals: List<Animal>) {
    operator fun iterator(): Iterator<Animal> {             // 1
        return animals.iterator()                           // 2
    }
}

fun main() {
    val zoo = Zoo(listOf(Animal("monkey"), Animal("unicorn")))
    for (animal in zoo) {                                   // 3
        println("여기 ${animal.name} 있어요!")
    }
}

operator fun iterator(): Iterator<클래스명> 은 지켜줘야 한다.
return animals.iterator()를 통해 Zoo에 있는 파라미터를 반복시켜주게 된다.

0개의 댓글