Kotlin 제네릭에 대한 모든 것

Kailash Vaviya 2024년2월15일
  1. 코틀린 제네릭
  2. Kotlin Generics를 사용하지 않는 문제
  3. Kotlin Generics가 문제를 해결하는 방법
  4. Kotlin에서 제네릭 메서드 유형 전달
Kotlin 제네릭에 대한 모든 것

이 문서에서는 Kotlin 제네릭의 개념을 소개합니다. Kotlin 제네릭은 다양한 데이터 유형을 통해 액세스할 수 있는 클래스와 함수를 정의할 수 있는 강력한 기능입니다.

코틀린 제네릭

제네릭을 매개변수화된 유형으로 선언해야 합니다. 이러한 매개변수화된 유형은 제네릭 유형의 인스턴스이며 꺾쇠 괄호 <>를 사용하여 선언됩니다.

제네릭 클래스와 메서드의 유형 차이는 컴파일 시간에 확인됩니다.

구문은 다음과 같습니다.

일반 클래스:

class_or_interface<Type>

일반 방법:

<Type>methodName(parameter: classType<Type>)

Kotlin 제네릭이 강력한 기능이라는 것을 알고 있지만 강력한 기능은 무엇입니까? 그것이 그들이 제공하는 이점입니다.

코틀린 제네릭의 장점

Kotlin 제네릭은 다음과 같은 주요 이점을 제공합니다.

  1. 유형 안전성 - 일반은 단일 유형의 개체만 보유할 수 있으므로 유형 오류의 가능성을 제거합니다.
  2. 타입캐스팅이 필요 없음 - 일반은 객체 타입캐스팅의 필요성을 완화합니다.
  3. 컴파일 시간 검사 - 런타임 오류를 피하기 위해 컴파일 시간에 검사가 수행됩니다.

Kotlin Generics를 사용하지 않는 문제

문제는 Kotlin 제네릭을 사용하지 않고는 매개변수에 대해 다른 데이터 유형을 전달할 수 없다는 것입니다. 이를 보기 위해 한 가지 예를 살펴보겠습니다.

단일 매개변수를 사용하여 Student 클래스를 생성합니다. 그런 다음 두 가지 데이터 유형인 IntString을 전달하여 컴파일 시간에 어떤 일이 발생하는지 확인합니다.

class Student (id:Int){
    var id: Int = id
    init {
        this.id = id
        println(id)
    }
}

fun main(args: Array<String>){
    var idInt: Student = Student(17)
    var idString: Student = Student("19") // This throws an error
}

출력:

Kotlin 제네릭을 사용하지 않고 다른 데이터 유형 전달

출력에서 볼 수 있듯이 프로그램에서 컴파일 타임 오류가 발생합니다. 코드는 초기화될 때 Int 유형을 허용하지만 String 유형 "19"를 거부합니다.

Kotlin Generics가 문제를 해결하는 방법

여러 데이터 유형의 문제를 극복하기 위해 일반 클래스를 사용할 수 있습니다. 제네릭 클래스는 단일 매개변수에 대해 여러 데이터 유형을 허용하므로 이 문제를 극복할 수 있습니다.

여기에서 IntString 유형을 모두 허용하는 일반 클래스를 만듭니다.

class Student<T>(id: T){
    var id: T = id
    init {
        this.id = id
        println(id)
    }
}

fun main(args: Array<String>){
    var idInt: Student<Int> = Student(17)
    var idString: Student<String> = Student("19") // This won't throw an error
}

출력:

Kotlin 제네릭을 사용하여 다양한 데이터 유형 전달

위의 예에서 객체의 데이터 유형은 전달한 매개변수에 따라 변경됩니다.

Kotlin에서 제네릭 메서드 유형 전달

Kotlin 제네릭을 사용하여 초기화 중에 다양한 데이터 유형을 전달하는 방법을 살펴보았습니다. 그러나 제네릭 메서드를 매개변수로 전달하려면 어떻게 해야 할까요?

다음은 일반 메서드를 만들고 매개 변수로 전달하는 예입니다.

import kotlin.reflect.KClass

data class Person(val city: String)
data class Employee(val city: String)

fun getPerson(): List<Person> = listOf(Person("New York"))
fun getEmployee(): List<Employee> = listOf(Employee("Chicago"))

fun <T: Any> getInfo(xyz: KClass<T>): List<T>? {
    return when(xyz) {
        Person::class -> getPerson() as List<T>
        Employee::class -> getEmployee()  as List<T>
        else -> null
    }
}

fun main(args: Array<String>) {
    val v = listOf(Person::class, Employee::class)
    v.forEach { type ->
        val i = getInfo(type)
        println(i)
    }
}

출력:

Kotlin 제네릭 메서드를 매개변수로 전달

Kailash Vaviya avatar Kailash Vaviya avatar

Kailash Vaviya is a freelance writer who started writing in 2019 and has never stopped since then as he fell in love with it. He has a soft corner for technology and likes to read, learn, and write about it. His content is focused on providing information to help build a brand presence and gain engagement.

LinkedIn