Page 27 -
P. 27

U가 T의 하위 타입이므로 위 함수는 트리 원소의 타입보다 더 일반적인 타입의 리스트를 인자로
                    받을 수 있다. 예를 들어, Int 트리나 Double 트리에 있는 원소들을 (이 두 타입의 공통 상위 타입
                    인) Number 타입의 리스트에 추가할 수 있다.

                      fun main() {
                        val list = ArrayList<Number>()

                        TreeNode(1).apply {
                          addChild(2)
                          addChild(3)
                        }.toList(list)

                        TreeNode(1.0).apply {                                                         9
                          addChild(2.0)
                          addChild(3.0)                                                               제네릭스
                        }.toList(list)
                      }


                     자바 vs. 코틀린  코틀린 타입 파라미터의 상위 바운드는 자바의 상위 바운드와 비슷하다. 표현하는
                    방식이 자바에서는 T extends Number이지만 코틀린에서는 T: Number라는 점이 다르다.
                    아주 흔한 경우로 타입 파라미터를 널이 아닌 타입으로 제한하는 경우가 있다. 이를 위해서는 상

                    위 바운드로 널이 될 수 없는 타입을 지정해야 한다.

                      fun <T: Any> notNullTreeOf(data: T) = TreeNode(data)

                    타입 파라미터 구문을 사용하면 상위 바운드를 하나만 지정할 수 있다. 하지만 한 타입 파라미터

                    에 여러 제약을 가할 필요가 있을 때도 있다. 이럴 때는 좀 더 복잡한 타입 제약 구문을 통해 타입
                    을 제한할 수 있다. 예를 들어 다음과 같은 인터페이스가 있다고 하자.

                      interface Named {
                        val name: String
                      }


                      interface Identified {
                        val id: Int
                      }

                    이름과 식별자가 모두 있는 객체 레지스트리를 정의하고 싶다고 가정하자.





                                                                                                  367





     Kotlin_05.indd   367                                                                    2022-02-15   오후 4:08:04
   22   23   24   25   26   27   28   29   30   31   32