[kotlin] 반복자 디자인 패턴과 코틀린

코틀린은 자바에서 사용되는 반복자 디자인 패턴을 간편하게 구현할 수 있는 다양한 기능을 제공합니다. 반복자 디자인 패턴은 컬렉션의 요소를 순회하거나 검색할 때 유용하게 사용됩니다. 코틀린에서는 이를 위해 다양한 방식을 제공합니다.

Iterator 인터페이스

코틀린은 Iterator 인터페이스를 제공하여 컬렉션을 순회할 때 사용할 수 있는 표준 인터페이스를 정의하고 있습니다. 이를 활용하여 직접 반복자 디자인 패턴을 구현할 수 있습니다.

class CustomIterator(private val data: List<Int>) : Iterator<Int> {
    private var index = 0

    override fun hasNext(): Boolean {
        return index < data.size
    }

    override fun next(): Int {
        return data[index++]
    }
}

fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    val iterator = CustomIterator(numbers)
    while (iterator.hasNext()) {
        println(iterator.next())
    }
}

확장 함수와 iterator 함수

코틀린에서는 확장 함수를 활용하여 기존의 컬렉션에도 반복자 기능을 추가할 수 있습니다. 이를 위해 iterator 함수를 사용할 수 있습니다. 이를 통해 사용자 정의 데이터 구조에 대한 반복기능을 구현할 수 있습니다.

class CustomIterable(private val data: List<Int>) {
    operator fun iterator(): Iterator<Int> {
        return data.iterator()
    }
}

fun main() {
    val numbers = CustomIterable(listOf(1, 2, 3, 4, 5))
    for (number in numbers) {
        println(number)
    }
}

시퀀스(Sequence)와 레이지 연산

코틀린에서는 시퀀스를 활용하여 레이지한 방식으로 연산을 수행할 수 있습니다. 시퀀스를 이용하면 중간 연산과 최종 연산 사이에 중간 결과를 저장하거나 재계산하지 않고도 원소를 처리할 수 있습니다.

fun main() {
    val numbers = sequenceOf(1, 2, 3, 4, 5)
    val result = numbers
        .filter { it % 2 == 0 }
        .map { it * it }
        .toList()
    println(result)  // 출력: [4, 16]
}

결론

코틀린은 다양한 방식으로 반복자 디자인 패턴을 활용할 수 있는 기능을 제공합니다. 이러한 기능을 적절히 활용하여 데이터를 효율적으로 처리하고 관리할 수 있습니다.

참고문헌: