Developer성현 2024. 10. 30. 00:37

제네릭은 코드를 작성하면서 다양한 데이터타입의 안정성을 높여주기 위해 만들어진 개념 입니다.

간단하게 어떤 데이터 타입이 들어오더라고 해당 타입으로 지정이 되는 익명 타입 이라고 보면 될거 같습니다.

 

사실 저의는 배열을 사용하면서 이미 제네릭을 사용하였습니다.

Array<Int>
Array<Float>
Array<String>
Array<Boolean>

 

이렇게 Array<> 꺾쇠 내부에 생성하고자 하는 배열의 데이터 타입을 넣어서 해당 타입의 배열을 만들어 사용하였습니다.

 

이번에는 직접 제네릭을 사용하는 방법을 알아보고 제네릭 클래스를 만들어 보겠습니다.

class GenericClass<T> (val dataA: T)

제네릭 클래스는 클래스 명 뒤에 <>를 열고 안에 타입 명을 넣어주시면 됩니다. 이 부분에는 데이터 타입명이 들어가는 자리이지만 코드를 작성하는 시점에서는 타입이 정해져 있지 안습니다. 정확히 말하면 컴파일 과정에서 사용될 타입에 맞게 변환이 되는것 입니다. 그러면 정수타입은 Int, 실수는 Flost, 문자열은 String 로 타입명이 지정되어 있지만 타입명이 정해져 있지 안은 제네릭은 어떻게 작성을 해야 할까요

정답은 여러분 마음대로 입니다. 실제로 코틀린에서 사용하는 키워드를 제외하고 무엇을 작성하는 상관은 없습니다.

하지만 관례적으로 Type 의 약자인 T 로 작성을 합니다. 만약 여러개의  타입 파라미터가 필요할 경우 T이후에 나오는 알파벳 U, V 를 사용하기도 하고 T1, T2 로 작성하기도 합니다.

fun main() {
    val integerType = GenericClass(0)
    println(integerType.typeCheck())

    val stringType = GenericClass("text")
    println(stringType.typeCheck())

    val floatType = GenericClass(3.14)
    println(floatType.typeCheck())
}

class GenericClass<T> (val dataA: T){

    fun typeCheck(): String{
        print("$dataA: ")
        val str = when(dataA){
            is Int -> "정수 타입"
            is String -> "문자열 타입"
            else -> "그외"
        }
        return str
    }

}

위 클래스는 제네릭 클래스를 이용해서 타입을 확인하는 코드입니다. 

 

제네릭은 함수와도 사용이 가능합니다.

fun main() {
    genericClass(1)
    genericClass("문자")
    genericClass(9.8f)
    genericClass(3.14)
}

fun <T>genericClass(dataA: T){
    val str = when(dataA){
        is Int -> "정수"
        is Float -> "실수"
        is String -> "문지열"
        else -> "그외"

    }
    println(str)
}

 

제네릭 사용법은 다양하기 때문에 저도 추가적으로 공부하면서 업데이트 하겠습니다.

 

감사합니다.