본문 바로가기
프로그래밍/안드로이드 <Kotlin>

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

by TaeGyeong Lee 2023. 7. 5.

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

 

제너릭 (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에 관해 설명하겠습니다.