캐스팅 연산을 거치는 것은 프로그램 속도를 저하시키는 단점이 있다.
함수나 클래스를 선언할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 타입 파러미터를 받아 사용하는 방법이다.
타입 파라미터에 특정 자료형이 할당되면 제너릭이 사용되는 모든 코드는 할당된 자료형으로 대체되어 컴파일 된다.
할당된 자료형으로 대체되어 컴파일
<T / U / V>
함수에 제너릭을 선언한 경우 파라미터나 반환형을 통해 자동 추론
특정한 수퍼클래스를 상속받은 클래스 타입으로만 제한하려면
<T: SuperClass>
fun main() {
// 파라미터로 클래스A의 인스턴스를 넘겨주고 doShouting 수행
UsingGeneric(A()).doShouting()
UsingGeneric(B()).doShouting()
UsingGeneric(C()).doShouting()
doShouting(B())
}
// 제너릭을 함수에 사용하는 법
fun <T:A> doShouting (t:T){
t.shout()
}
open class A {
open fun shout() {
println("A가 소리칩니다")
}
}
class B: A() {
override fun shout() {
println("B가 소리칩니다")
}
}
class C: A() {
override fun shout() {
println("C가 소리칩니다")
}
}
// 수퍼클래스를 A로 제한한 제너릭 T를 선언하고, 생성자에서는 제너릭 T에 맞는 인스턴스를 속성 t로 받는다
class UsingGeneric <T:A>(val t:T) {
fun doShouting() {
t.shout()
}
}
A가 소리칩니다
B가 소리칩니다
C가 소리칩니다
B가 소리칩니다