간략하게 표현하면, 자료구조를 반복하기 위한 도구라고 이해하면 될 듯하다.
코틀린 뿐 아니라 다른 프로그래밍 언어에서도 컬렉션들에는 반복할 수 있는 기능이 포함되어 있다.
코틀린의 자료구조 중 하나인 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에 있는 파라미터를 반복시켜주게 된다.