안드로이드 <Kotlin>

[Kotlin] 코틀린 제네릭(Generics)의 기본

TaeGyeong Lee 2023. 7. 5. 12:54

코틀린은 타입 안정성과 유연함 극대화에 대한 고민을 통해 만들어진 언어입니다. 이번 글을 통해 코틀린 제너릭이 무엇인지 알아보겠습니다.

 

제너릭 (Generic)

제너릭은 클래스 내부에서 사용하는 변수의 자료형을 외부에서 설정할 수 있도록 돕는 기법입니다. 아래의 코드를 보면 동일한 클래스 Phone 내의 version변수가 아이폰은 문자열, 갤럭시는 정수로 저장되는 것을 확인할 수 있습니다.

갤럭시의 버전이 항상 정수로 이루어져 있고 아이폰의 버전은 항상 문자열로 표시, 저장되어야 할 때(예시를 위한 가정) 이 상황에서 제너릭은 기존의 엄격한 타입 체킹의 제약에서 벗어나는 방법이 될 수 있습니다.

fun main() {
    var iphone: Phone<String> = Phone("14ProMax")
    var galaxy: Phone<Int> = Phone(23)
    
    iphone.getVersion() // 14ProMax
    galaxy.getVersion() // 23
}

class Phone<T>(version: T){
    var version = version
    fun getVersion(){
        println(version)
    }
}

 

함수에서도 활용 가능

함수에도 제네릭을 활용할 수 있습니다. 아래 코드는 정수와 문자열로 version을 다르게 받았음에도 정상적으로 실행됩니다.

fun main() {
    println("Hello, world!!!")
    
    getVersion(23) // 23
    getVersion("14ProMax") // 14ProMax
}

fun <T> getVersion(version: T){
    println(version)
}

 

반드시 T로 표현해야 하나요?

우리는 이러한 제너릭을 표현하기 위해 암묵적으로 T, U, V와 같은 방식으로 표현합니다. 반드시 T,U,V로 명시할 필요는 없습니다. 아래 코드도 문제 없이 실행됩니다.

class Phone<이반페리시치>(version: 이반페리시치){
    var version = version
    fun getVersion(){
        println(version)
    }
}

 

다음 글에서 in, out, where에 관해 설명하겠습니다.