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
   21   22   23   24   25   26   27   28   29   30   31