개발(Android)/kotlin syntax

[Kotlin syntax] Generic

shinyelee 2022. 4. 7. 00:17

[코틀린 문법] 제너릭

// Generic(제너릭) //

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

// 타입 파라미터는 관례적으로 <T> 사용
// (여럿일 경우 T, U, V 등 알파벳 사용)

// 제너릭을 특정한 수퍼 클래스를 상속받은 클래스 타입으로만 제한하려면
// <T: SuperClass> 라고 쓰면 됨

fun main() {

    UsingGeneric(S()).doSing()
    UsingGeneric(Y()).doSing()
//    시은이가 노래를 합니다
//    자윤이가 노래를 합니다

    doSing(Y())
    doSing(I())
//    자윤이가 노래를 합니다
//    아이사가 노래를 합니다

}

fun <T: S> doSing(t: T) {
    t.sing()
}

// 수퍼 클래스
open class S {
    open fun sing() {
        println("시은이가 노래를 합니다")
    }
}

class Y : S() {
    override fun sing() {
        println("자윤이가 노래를 합니다")
    }
}

class I : S() {
    override fun sing() {
        println("아이사가 노래를 합니다")
    }
}

class UsingGeneric<T: S> (val t: T) {
    fun doSing() {
        t.sing()
    }
}
// 컴파일시 타입 체크 가능
// 타입캐스팅 노필요

fun main() {

    val box1 = Box1(10)
    println(box1.value)
//    10

    val box2 = Box2("문자 10")
    println(box2.value)
//    문자 10



    // 문자 10을 box1에 넣으려면 원래는 이렇게 해야함
    
    val box1_1 = Box1("10".toInt())
    println(box1_1.value)
//    10

    val box3 = Box3(10)
    println(box3.value)
//    10

    val box4 = Box3("10")
    println(box4.value)
//    10



    // 문자 123은 ㄱㅊ 숫자 123은 에러남
//    testFun1("123")
//    testFun1(123)

    // 둘 다 문제없이 출력됨됨
    testFun2("123")
    testFun2(123)
//    123
//    123

    // 꼭 T가 아니라 다른 알파벳이어도 ㄱㅊ
    testFun3("123")
    testFun3(123)
//    123
//    123

}

fun testFun1(a : String) {
    println(a)
}

fun <T> testFun2(a : T) {
    println(a)
}

fun <A> testFun3(a : A) {
    println(a)
}



class Box1(test : Int) {
    val value = test
}

class Box2(test : String) {
    var value = test
}

// Generic
class Box3<T>(test : T) {
    var value = test
}

참고

 

[입문편] 안드로이드를 위한 코틀린(Kotlin) 문법 - 인프런 | 강의

코틀린 문법 기초 강의입니다. 안드로이드 앱을 코틀린 언어로 개발하고 싶으신 분들을 위한 강의이고, 기초부터 튼튼하게 코틀린 문법을 재미있게 공부할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

반응형