Page 25 -
P. 25

에만 적용할 수 있기 때문에 트리 원소가 Number 타입(또는 그 하위 타입)의 값이길 바란다. 이런
                    특성을 표현하기 위해 타입 파라미터의 상위 바운드(upper bound)로 Number를 선언할 수 있다.

                      fun <T : Number>TreeNode<T>.average(): Double {
                        var count = 0
                        var sum = 0.0
                        walkDepthFirst {  // 깊이 우선으로 노드를 방문하면서 함수 수행
                          count++
                          sum += it.toDouble()
                        }
                        return sum/count
                      }

                    타입 파라미터에 상위 바운드가 있으면, 컴파일러는 이 타입 파라미터에 공급된 타입 인자의 타입                              9
                    이 상위 바운드의 하위 타입인지 검사한다. 디폴트 상위 바운드는 Any?로 간주되므로 이를 명시할                            제네릭스

                    필요는 없고, 이런 경우 이 타입 파라미터는 모든 코틀린 타입을 타입 인자로 받을 수 있다. Int와
                    Double이 Number의 하위 타입이기 때문에 다음 코드는 올바른 코드다.

                      val intTree = TreeNode(1).apply {
                        addChild(2).addChild(3)
                        addChild(4).addChild(5)
                      }
                      println(intTree.average()) // 3.0

                      val doubleTree = TreeNode(1.0).apply {
                        addChild(2.0)
                        addChild(3.0)
                      }
                      println(doubleTree.average()) // 2.0


                    average()를 문자열 트리에 대해 호출하면 컴파일 오류가 발생한다.

                      val stringTree = TreeNode("Hello").apply {
                        addChildren("World", "!!!")
                      }
                      // error: unresolved reference. None of the following candidates is applicable because
                      of receiver type mismatch
                      println(stringTree.average())


                    final 클래스를 상위 바운드로 사용하면 한 가지 타입만 지정할 수 있기 때문에 이런 바운드는 쓸
                    모가 없다. 따라서 이런 경우 컴파일러가 경고를 표시한다.


                                                                                                  365





     Kotlin_05.indd   365                                                                    2022-02-15   오후 4:08:04
   20   21   22   23   24   25   26   27   28   29   30