Kotlin Weekly

Kotlin Weekly # -377 "Kotlin 제네릭 변성"

베블렌 2023. 12. 11. 21:21

10월 4주차에는 Kotlin 제네릭 변성에 대한 글입니다.

 

https://verbosemode.substack.com/p/kotlin-and-variance-navigating-type

 

Kotlin and Variance: Navigating Type Relationships

Demystifying Generics: A Comprehensive Exploration of Type Variance in Kotlin and its Practical Implications in Software Development

verbosemode.substack.com

 

 

소개

이 글은 Kotlin에서 제네릭 타입의 변성(variance)에 대해 설명하고 있습니다. 제네릭 타입의 공변성(covariance), 반공변성(contravariance), 불변성(invariance)에 대한 이해를 통해 더욱 유연하고 효율적인 코드를 작성할 수 있습니다. 이러한 개념들은 Kotlin뿐만 아니라 Scala, Java, C#, Swift 등 다른 언어에서도 중요합니다.

 

 

내용

 

제네릭(generic)이란?

자바에서 제네릭(generic)이란 데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미합니다.

제네릭은 클래스나 메소드에서 사용할 내부 데이터 타입을 컴파일 시에 미리 지정하는 방법입니다.

이렇게 컴파일 시에 미리 타입 검사(type check)를 수행하면 다음과 같은 장점을 가집니다.

 

1. 클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있습니다

2. 반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있습니다.

 

 

공변성 (Covariance)

  • 개념: 하위 타입 관계가 있을 때, 이를 컬렉션 또는 다른 제네릭 타입에 적용할 수 있습니다.
  • Kotlin 예시:
open class Beverage
class Coffee : Beverage()

class VendingMachine<out T> {
    fun dispense(): T? = null
}

val coffeeMachine: VendingMachine<Coffee> = VendingMachine()
val beverageMachine: VendingMachine<Beverage> = coffeeMachine // 공변성

 

 

반공변성 (Contravariance)

  • 개념: 상위 타입을 하위 타입처럼 다룰 수 있습니다.
  • Kotlin 예시:
open class PaymentMethod
class Cash : PaymentMethod()

class PaymentProcessor<in P> {
    fun process(payment: P) {}
}

val processor: PaymentProcessor<Cash> = PaymentProcessor<PaymentMethod>() // 반공변성

 

불변성 (Invariance)

  • 개념: 타입 파라미터가 상위/하위 타입 관계를 유지하지 않습니다.
  • Kotlin 예시:
class RepairManual<T>

val coffeeManual: RepairManual<Coffee> = RepairManual()
// val beverageManual: RepairManual<Beverage> = coffeeManual // 오류: 불변성 때문에 호환되지 않음

 

 

  • Kotlin 표준 라이브러리 예시
    • List<out T>는 공변성을 가지며, MutableList<T>는 불변성을 가집니다.
    • Comparator<in T>는 반공변성을 가지며, 다양한 타입의 객체를 비교할 수 있습니다.
  • Java 배열의 문제점
    • Java 배열은 공변성을 가지지만, 이로 인해 ArrayStoreException과 같은 런타임 오류가 발생할 위험이 있습니다.

 

정리

 

이 글은 Kotlin에서의 제네릭 타입의 변성(variance)에 대해 상세히 설명하고 있으며, 이 개념들이 어떻게 소프트웨어 개발에 실질적으로 적용될 수 있는지 보여주고 있습니다. 제네릭 타입의 공변성, 반공변성, 불변성에 대한 이해는 코드의 유연성과 타입 안정성을 크게 향상시킬 수 있습니다.

(*추가적인 실습 필요)

 

 

 

 

 

http://kotlinweekly.net/

 

** Kotlin Weekly **

 

kotlinweekly.net