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 |