Kotlin

[android : kotlin] 코틀린 제너릭(Generic) 사용 방법 및 예제

코틀린도 자바와 같이 제너릭을 지원한다. 제너릭은 클래스나 함수를 생성할 때 타입을 정하지 않는 것을 의미한다.  그렇기 때문에 타입이 다른 종류의 여러 개의 클래스를 정의하지 않아도 된다. 제너릭(Generic)은 많은 기본 클래스에서 사용되고 있다. Generic를 사용하게 되면 캐스팅을 방지함으로 성능을 높일 수 있다. 캐스팅 연산이 이루어지면 프로그램의 속도를 저하시킬 수 있는 단점이 있다.  타입파라미터를 받아서 처리하는 제너릭이 나오게 되었다. 타입파라미터(T)를 사용게되며, 여러개의 제너릭을 사용하게 될 경우 , T의 다음 알파벳인 <T,U,V>를 사용하기도 한다. 특정한 수퍼 클래스를 상속받은 클래스 타입으로만 제한하려면 콜론(:)을 쓰고 수퍼클래스명을 명시하면 된다. 

 

■ 제너릭 클래스 생성방법

fun main() {
    UsingGeneric(TestA()).doShouting()
    UsingGeneric(TestB()).doShouting()
    UsingGeneric(TestC()).doShouting()
     
}
 
open class TestA {
    open fun shout(){
        println("A가 소리칩니다.")
    }
}

open class TestB : TestA() {
    override fun shout(){
        println("B가 소리칩니다.")
    }
}

open class TestC : TestA() {
    override fun shout(){
        println("C가 소리칩니다.")
    }
}

//수퍼클래스를 TestA로 제한한 제너릭T를 선언
class UsingGeneric<T: TestA> (val x: T){
    fun doShouting(){
        x.shout()
    }
}

[출력결과]

A가 소리칩니다.
B가 소리칩니다.
C가 소리칩니다.

■유형불일치 테스트

fun main() {
    UsingGeneric(TestA()).doShouting() 
}

 
open class TestA {
    open fun shout(){
        println("A가 소리칩니다.")
    }
}

open class TestC {
    fun shout(){
        println("C가 소리칩니다.")
    }
}

class UsingGeneric<T: TestC> (val x: T){
    fun doShouting(){
        x.shout()
    }
}

[출력결과]

Type mismatch: inferred type is TestA but TestC was expected

 

■제너릭을 함수에 사용하는 방법

fun main() {    
    shouting(TestB())
}


fun <T: TestA> shouting(x: T){
    x.shout()
}

open class TestA {
    open fun shout(){
        println("A가 소리칩니다.")
    }
}

open class TestB : TestA() {
    override fun shout(){
        println("B가 소리칩니다.")
    }
}
B가 소리칩니다.

 

 

[REFERENCE]

Kotlin 강좌 #19 – 제너릭

 

[연관]

m.blog.naver.com/PostView.nhn?blogId=horajjan&logNo=221568452695&proxyReferer=https:%2F%2Fwww.google.com%2F

 

thdev.tech/kotlin/androiddev/2017/10/03/Kotlin-Generics/

 

 

Leave a Reply

error: Content is protected !!