클래스나 함수에서 사용하는 자료형을 외부에서 지정할 수 있는 기능.
템플릿과 같은 기능.
일반적으로는 타입 파라미터의 이름은 Type의 T를 사용하는 것이 관례이다.
open class A {
open fun shout() {
println("A가 소리칩니다.")
}
}
class B : A() {
override fun shout() {
println("B가 소리칩니다.")
}
}
class C : A() {
override fun shout() {
println("C가 소리칩니다.")
}
}
// 제너릭 클래스
class UsingGeneric<T:A> (var t:T) {
fun doShouting() {
t.shout()
}
}
// 제너릭 함수
fun <T: A> doShouting(t: T) {
t.shout()
}
fun main() {
UsingGeneric(A()).doShouting() // param을 보고 자동으로 A임을 추론한다.
UsingGeneric(B()).doShouting()
UsingGeneric(C()).doShouting()
doShouting(B())
}
제너릭을 사용하면 타입 케스팅없이 실행되기 때문에 성능 관점에서 유리하다.