λ°λ³΅μ(Iterator) λ κ°μ²΄ μ§ν₯μ νλ‘κ·Έλλ°μμ λ°°μ΄μ΄λ κ·Έμ μ μ¬ν μλ£ κ΅¬μ‘°μ λ΄λΆμ μμλ₯Ό μν(traversing)νλ κ°μ²΄μ΄λ€.
Cursor
List λ± μ§ν© κ°μ²΄(aggregate object)λ€μ μ΄ λ΄λΆ νν ꡬ쑰λ₯Ό λ ΈμΆνμ§ μκ³ λ μμ μ μμλ₯Ό μ κ·Όν μ μλ λ°©λ²μ μ 곡νλκ² μ’λ€. μΆκ°μ μΌλ‘, μ΄λ―Έ μ μλ λ°©λ²κ³Ό λ€λ₯Έ λ°©μμΌλ‘ μμλ€μ μννκ³ μ ν μλ μλ€. νμ§λ§ μν λ°©λ²μ΄ λ°λμλ€κ³ List Classμ Interfaceλ₯Ό λ³κ²½νκ³ μΆμ§λ μμκ²μ΄λ€.
μ΄λ° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ λ§λ€μ΄μ§ κ²μ΄ λ°λ³΅μ ν¨ν΄ μ΄λ€. μ΄ ν¨ν΄μ ν΅μ¬μ List κ°μ²΄μ μ κ·Όν΄μ μλ‘μ΄ λ΄μ©μ μ½μ , μμ νΉμ μννλ λ΄μ©μ λ°λ³΅μ κ°μ²΄μ μ μνλ κ². μ¦ λ°λ³΅μ κ°μ²΄λ₯Ό λνλ΄λ Iterator Classλ μμλ€μ μ κ·Όνλλ° νμν interfaceλ₯Ό μ 곡ν©λλ€. μ¦ λ°λ³΅μ κ°μ²΄λ νμ¬ μμκ° λ¬΄μμΈμ§ κ΄λ¦¬νκ³ , μ΄λ―Έ λ°©λ¬Έν μμλ€μ΄ 무μμΈμ§ μκ³ μλ€.
λ°λ³΅μ ν¨ν΄μ μ΄λ° λͺ©μ μΌλ‘ μ¬μ© λ©λλ€.
- κ°μ²΄ λ΄λΆ νν λ°©μμ λͺ¨λ₯΄κ³ λ μ§ν© κ°μ²΄μ κ° μμλ€μ μ κ·Όνκ³ μΆμ λ
- μ§ν© κ°μ²΄λ₯Ό μννλ λ€μν λ°©λ²μ μ§μνκ³ μΆμ λ
- μλ‘ λ€λ₯Έ κ°μ²΄ ꡬ쑰μ λν΄μλ λμΌν λ°©λ²μΌλ‘ μννκ³ μΆμ λ
class LinkedList<T> {
private data class Node<T>(val nodeValue: T, var next: Node<T>? = null)
private var head: Node<T>? = null
fun insert(item: T) {
if (head == null) head = Node(item)
var cursor = head
while (cursor?.next != null) {
cursor = cursor.next
}
cursor?.next = Node(item)
}
fun forEach(action: (T) -> Unit) {
var cursor = head
while (cursor != null) {
action(cursor.nodeValue)
cursor = cursor.next
}
}
}
fun main() {
val linkedList = LinkedList<Int>()
linkedList.insert(1)
linkedList.insert(2)
linkedList.insert(3)
linkedList.insert(4)
linkedList.insert(5)
linkedList.forEach {
println(it)
}
}