kotlin

코틀린 제네릭이란 ?

메모는나의열정 2023. 1. 19. 01:50
반응형

소개

Kotlin 제네릭은 재사용 가능하고 형식이 안전한 코드를 생성할 수 있는 강력한 기능입니다. 유형을 매개변수화하는 방법을 제공하여 다양한 상황에 더 유연하고 적응할 수 있도록 합니다. 이 글에서는 Kotlin 제네릭을 정의하고 사용하는 방법을 포함하여 Kotlin 제네릭의 기본 사항은 물론 일부 고급 기능과 이를 사용하기 위한 모범 사례에 대해 설명합니다.

제네릭 정의

< >Kotlin에서 일반 유형은 클래스 또는 함수 이름 뒤에 꺾쇠 괄호( ) 안에 유형 매개변수를 배치하여 정의됩니다 . 예를 들어 다음은 다음과 같은 간단한 컨테이너에 대한 일반 클래스 정의입니다 MyContainer.


class MyContainer<T>(var item: T)

이 예에서 T는 클래스의 유형 매개변수입니다. 모든 유형이 될 수 있으며 클래스의 인스턴스가 생성될 때 지정됩니다. 예를 들어:


val container = MyContainer<String>("Hello World!")

이 경우 T는 유형으로 유추 String되므로 인스턴스 의 item속성은 유형 입니다.containerString

다음과 같이 쉼표로 구분하여 여러 유형 매개변수를 정의할 수도 있습니다.


class MyPair<T, U>(var first: T, var second: U)

그런 다음 다음과 같이 사용하십시오.


val pair = MyPair<String, Int>("Hello", 42)

제네릭 사용

제네릭 형식이 정의되면 다양한 방식으로 사용할 수 있습니다. 가장 일반적인 사용 사례는 제네릭 형식의 인스턴스를 만들고 해당 속성과 메서드를 사용하는 것입니다. 예를 들어:


val container = MyContainer<String>("Hello World!")
println(container.item) // prints "Hello World!"

제네릭 형식을 다른 형식 및 함수에 대한 인수로 사용하는 것도 가능합니다. 예를 들어:


fun printItem(container: MyContainer<Any>) {
    println(container.item)
}val container = MyContainer<String>("Hello World!")
printItem(container) // prints "Hello World!"

동일한 기능을 다른 유형의 컨테이너와 함께 사용할 수 있으므로 유연성과 재사용성이 향상됩니다.

고급 기능

Kotlin 제네릭은 더 복잡한 사용 사례를 위한 다양한 고급 기능도 제공합니다.

범위

경계는 유형 매개변수로 사용할 수 있는 유형에 대한 제한입니다. Kotlin에서 범위는 where키워드를 사용하여 지정됩니다. 예를 들어, 다음 클래스는 유형 매개변수가 다음의 하위 유형일 수만 허용합니다 Number.


class MyNumberContainer<T : Number>(var item: T)

즉, 의 인스턴스는 , 또는 와 같이 MyNumberContainer의 하위 유형인 유형으로만 만들 수 있습니다 .NumberIntDoubleFloat


val container = MyNumberContainer<Int>(42) // Ok
val container2 = MyNumberContainer<String>("Hello") // Error

무효성

Kotlin의 유형 시스템에는 유형의 일부로 null 허용 여부가 포함됩니다. 형식 매개 변수가 null을 허용하도록 하려면 ?연산자를 사용할 수 있습니다. 을 위한

data:image/svg+xml,%3csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20version=%271.1%27%20width=%2730%27%20height=%2730%27/%3e

계속 쓰다

예를 들어, 다음 클래스는 형식 매개 변수가 null을 허용하도록 허용합니다.


class MyNullableContainer<T>(var item: T?)

이는 또는 MyNullableContainer와 같이 null을 허용하는 유형으로 의 인스턴스를 만들 수 있음 을 의미합니다 .String?Int?


val container = MyNullableContainer<String>("Hello") // Ok
val container2 = MyNullableContainer<String?>(null) // Ok

변화

가변성은 유형 매개변수가 다른 유형의 하위 유형일 때 제네릭 유형이 작동하는 방식을 나타냅니다. Kotlin은 세 가지 유형의 분산을 지원합니다.

  • 공변량( CovariantList<String>List<Any>) : 유형 매개변수를 하위 유형으로 대체할 수 있는 경우 제네릭 유형은 공변량입니다. 예를 들어

    는 의 하위 유형입니다.

  • 반공변성( ContravariantConsumer<Any>Consumer<String>) : 제네릭 유형은 해당 유형 매개변수를 상위 유형으로 대체할 수 있는 경우 반공변성입니다. 예를 들어

    는 의 하위 유형입니다.

  • Invariant

    : 유형 매개변수가 하위 유형이나 상위 유형으로 대체될 수 없는 경우 제네릭 유형은 불변입니다. 이것은 Kotlin에서 대부분의 일반 유형에 대한 기본 동작입니다.

유형 매개변수에 대한 분산을 지정 하기 위해 유형 매개변수 in앞에 out, 또는 no 키워드가 사용됩니다. 예를 들어:

코드 복사
interface MyCovariantList<out T> {
    fun get(index: Int): T
}interface MyContravariantConsumer<in T> {
    fun consume(item: T)
}

이 예에서 MyCovariantList는 공변이고 MyContravariantConsumer반변입니다.

모범 사례

Kotlin에서 제네릭으로 작업할 때 코드가 명확하고 유지 관리 가능하며 효율적인지 확인하는 몇 가지 모범 사례를 염두에 두는 것이 중요합니다.

  • 의미 있는 유형 매개변수 이름 사용TUVABC

    : 유형 매개변수 이름은 , 또는 와 같은 단일 문자가 아니라

    ,

    또는 와 같이 설명적이고 의미가 있어야 합니다 .

  • Anyor 사용NothingAnyNothing

    금지 : or 를 사용하는 대신

    범위 또는 null 허용 여부를 사용하여 유형 매개변수를 지정합니다.

  • 분산

    에 유의하십시오. 분산을 적절하게 사용하여 코드의 유형이 안전하고 불필요한 캐스팅을 방지하십시오.

  • 유형 별칭

    사용 : 유형 별칭을 사용하여 코드를 더 읽기 쉽게 만들고 장황함을 줄입니다.

결론

Kotlin 제네릭은 재사용 가능하고 형식이 안전한 코드를 생성할 수 있는 강력한 기능입니다. 유형을 매개변수화하는 방법을 제공하여 다양한 상황에 더 유연하고 적응할 수 있도록 합니다. Kotlin 제네릭을 정의하고 사용하는 방법을 비롯하여 Kotlin 제네릭의 기본 사항과 몇 가지 고급 기능 및 이를 사용하는 모범 사례를 이해하면 제네릭을 사용하여 효율적이고 유지 관리 가능한 코드를 작성할 수 있습니다.

반응형

'kotlin' 카테고리의 다른 글

Kotlin의 let, with, run, apply 및 함수 사용방법  (0) 2023.01.19
코틀린 코루틴이란 ?  (0) 2023.01.19
코틀린 배열 - 5  (0) 2023.01.09
코틀린 문자열 연결 - 4  (0) 2023.01.09
코틀린 변수 선언 - 3  (1) 2023.01.09