제네릭 타입을 정의하려면 클래스 이름 뒤에, 내부에 하나 이상의 제네릭 플레이스홀더(generic placeholder)5가 들어 있는 부등호(<>)를 추가한다.

    예제 코드에서 T라는 플레이스홀더는 지금은 알 수 없는 어떤 타입을 대신하며, 제네릭 클래스 안에서는 일반 타입처럼 쓰인다.

    IntroGenerics/GenericHolder.kt

    package introgenerics
    import atomictest.eq
    
    class GenericHolder<T>(             // [1]
      private val value: T
    ) {
      fun getValue(): T = value
    }
    
    fun main() {
      val h1 = GenericHolder(Automobile("Ford"))
      val a: Automobile = h1.getValue() // [2]
      a eq "Automobile(brand=Ford)"
      val h2 = GenericHolder(1)
      val i: Int = h2.getValue()        // [3]
      i eq 1
      val h3 = GenericHolder("Chartreuse")
      val s: String = h3.getValue()     // [4]
      s eq "Chartreuse"
    }

    [1] GeneriCHolderT 타입의 객체를 저장하며, 멤버 함수 getValue()T 타입의 값을 반환한다.

    [2], [3], [4]에서 getValue()를 호출할 때 결과 타입이 자동으로 올바른 타입으로 지정된다.

    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.