Develop!/Kotlin

제네릭스 in Kotlin

체리필터 2023. 9. 22. 09:33
728x90
반응형

Java에서도 제네릭 타입이 이다. 어떠한 값을 사용할지 몰라 선언 시에 제네릭으로 선언하고 사용할 때 해당 타입으로 사용하는 것이다.

코틀린에서도 이러한 사용은 가능하다. 다음의 예를 통해 확인해 볼 수 있다.

data class Automobile(val brand: String)

class GenericHolder<T>(private val value: T) {
    fun getValue(): T = value
}

fun genericHolder() {
    val h1 = GenericHolder(Automobile("Ford"))
    val a = h1.getValue()
    println(a)

    val h2 = GenericHolder(1)
    val i: Int = h2.getValue()
    println(i)

    val h3 = GenericHolder("Chartreuse")
    val s: String = h3.getValue()
    println(s)
}

GenericHolder에 T로 선언한 제네릭을 사용했다.

이렇게 선언한 GenericHolder에는 Automobile Type 뿐 아니라 Int Type, String Type 등이 들어올 수 있다.

제네릭 대신에 Java에서 사용하는  Object와 같은 것을 사용할 수 도 있지만, Object는 어떤 타입인지 알 수 없으므로 명시적으로 Type Casting을 해야 한다.

코틀린에서는 Any라는 타입이 Java의 Object 같은 타입이다.

다음 예제를 보면 Any와 제네릭스의 차이를 알 수 있다.

class AnyHolder(private val value: Any) {
    fun getValue(): Any = value;
}

class Dog {
    fun bark() = "Ruff!"
}

fun anyHoler() {
    val holder = AnyHolder(Dog())
    val any = holder.getValue()
    //any.bark()

    val genericHolder = GenericHolder(Dog())
    val dog = genericHolder.getValue()
    println(dog.bark())
}

any는 Any 타입이라 bark()를 실행할 수 없다. 주석을 풀면 아래와 같은 오류가 뜬다.

 

728x90
반응형

'Develop! > Kotlin' 카테고리의 다른 글

컬렉션에 대한 연산 in Kotlin  (0) 2023.09.25
람다 in Kotlin  (0) 2023.09.25
안전한 호출과 엘비스 연산자 in kotlin  (0) 2023.09.14
Null이 될 수 없는 타입 in Kotlin  (0) 2023.09.06
구조 분해 선언 in Kotlin  (0) 2023.09.06