더북(TheBook)

제네릭 타입을 정의하려면 클래스 이름 뒤에, 내부에 하나 이상의 제네릭 플레이스홀더(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()를 호출할 때 결과 타입이 자동으로 올바른 타입으로 지정된다.

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