Page 26 -
P. 26
// 제네릭이 아닌 함수로 대신할 수 있다
// fun TreeNode<Int>.sum(): Int {...}
// warning: 'Int' is a final type, and thus a value of the type parameter is
predetermined
fun <T : Int> TreeNode<T>.sum(): Int { var sum = 0
walkDepthFirst{ sum += it }
return sum
}
타입 파라미터 바운드로 타입 파라미터를 사용할 수도 있으며, 이런 경우를 재귀적 타입 파라미터
라고 말한다. 예를 들어 트리 안에 Comparable 인터페이스의 인스턴스만 들어있다면, 최댓값이 들
어있는 노드를 찾을 수 있다.
fun <T : Comparable<T>> TreeNode<T>.maxNode(): TreeNode<T> {
val maxChild = children.maxByOrNull { it.data } ?: return this
return if (data >= maxChild.data) this else maxChild
}
fun main() {
// Double은 Comparable<Double>의 하위 타입임
val doubleTree = TreeNode(1.0).apply {
addChild(2.0)
addChild(3.0)
}
println(doubleTree.maxNode().data) // 3.0
// String은 Comparable<String>의 하위 타입임
val stringTree = TreeNode("abc").apply {
addChildren("xyz", "def")
}
println(stringTree.maxNode().data) // xyz
}
바운드가 자신보다 앞에 있는 타입 파라미터를 가리킬 수도 있다. 이런 바운드를 사용해 트리 원
소를 가변 리스트에 추가하는 함수를 정의할 수 있다.
fun <T, U : T> TreeNode<U>.toList(list: MutableList<T>) {
walkDepthFirst{ list += it }
}
366
Kotlin_05.indd 366 2022-02-15 오후 4:08:04