코틀린 강좌 #18 제너릭

Kotlin/기본 문법 · 2020. 12. 19. 15:44

테크과학! DiMo

 

테크과학! DiMo

개발자가 얘기하는 생활 속 IT기술에 대한 과학! 여러분이 몰랐던, 혹은 정확히 알지 못했던 IT 테크놀러지를 파드립니다! 좋은 영상을 위한 채널 후원, 투네이션을 통해서 해주세요! 후원링크 htt

www.youtube.com

 

 

개발 환경: play.kotlinlang.org


제네릭

 

클래스나 함수에서 사용하는 자료형을 외부에서 지정할 수 있는 기능


함수나 클래스를 선언할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 타입 파라미터를 받아

 

사용하는 방법

 

fun<T>genericFunc(param:T): T
class GenericClass<T>(var pref: T)

fun<Int>genericFunc(param:T): T
class GenericClass<Int>(var pref: T)

 

'T'를 사용하는 것이 관례.


여러 개일 경우 <T, U, V...>

특정한 수퍼 클래스를 상속받은 클래스 타입으로만 제한하려면 <T: SuperClass>

 

 

fun main() {
    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가 소리침")
    }
}
class UsingGeneric<T: A> (val t: T) {
    fun doShouting() {
        t.shout()
    }
}

Output:
A가 소리침
B가 소리침
C가 소리침
B가 소리침

 

 

제네릭을 사용하지 않고 생성자에서 수퍼클래스로 캐스팅하여 함수를 호출해도 동작은 같지만 제네릭을 사용할 경우

 

제네릭이 자료형을 대체하게 되어 캐스팅을 방지함으로써 성능을 높일 수 있다.