Kotlin/포스팅

코틀린 제네릭스

짜집퍼박사(짜박) 2024. 1. 2. 20:40

코틀린은 자바 가상 머신 (JVM)에서 실행되는 현대적인 프로그래밍 언어로, 제네릭스 기능을 지원합니다. 제네릭스는 데이터 타입을 일반화하여 코드의 재사용성과 안정성을 향상시키는 기술입니다. 코틀린에서 제네릭스를 사용하는 방법에 대해 자세히 살펴보겠습니다.

 

1. 기본 문법

코틀린에서 제네릭스를 사용하는 기본적인 문법은 다음과 같습니다.

class Box<T>(val value: T) {
    // ...
}

위의 예제에서 Box 클래스는 제네릭 타입 매개변수 T를 가지고 있습니다. 이것은 나중에 실제 타입으로 대체될 수 있는 일종의 자리 표시자입니다.

 

2. 제네릭 타입의 인스턴스 생성

제네릭 클래스의 인스턴스를 생성할 때, 실제 타입을 명시적으로 지정해야 합니다.

val intBox: Box<Int> = Box(42)
val stringBox: Box<String> = Box("Hello, Kotlin!")

 

3. 제네릭 함수

함수도 제네릭으로 만들 수 있습니다.

fun <T> printBoxContents(box: Box<T>) {
    println(box.value)
}

printBoxContents(intBox)  // 출력: 42
printBoxContents(stringBox)  // 출력: Hello, Kotlin!

 

4. 제한된 타입 매개변수

제네릭 타입 매개변수를 제한하여 특정 타입만을 허용하도록 할 수 있습니다.

class Box<T : Number>(val value: T) {
    // ...
}

val intBox: Box<Int> = Box(42)
val doubleBox: Box<Double> = Box(3.14)
// val stringBox: Box<String> = Box("Error")  // 오류: String은 Number의 하위 타입이 아님

 

5. 변성 (Variance)

코틀린에서는 제네릭의 변성을 지원합니다. 변성은 서브 타이핑 관계가 어떻게 유지되는지를 나타냅니다. 기본적으로 코틀린의 제네릭은 무공변성(invariant)입니다.

class Box<out T>(val value: T) {
    // ...
}

val anyBox: Box<Any> = Box("Hello, Kotlin!")
val stringBox: Box<String> = anyBox  // OK: out T는 반환 타입에서 공변성을 가질 수 있음

위의 예제에서 out 키워드는 제네릭 클래스 Box의 타입 매개변수 T가 공변성을 가짐을 나타냅니다.

 

6. 제네릭 확장 함수

제네릭 함수는 클래스뿐만 아니라 확장 함수로도 작성할 수 있습니다.

fun <T> Box<T>.printContents() {
    println(value)
}

intBox.printContents()  // 출력: 42
stringBox.printContents()  // 출력: Hello, Kotlin!

이와 같이 확장 함수를 활용하면 제네릭 클래스의 메서드를 더 쉽게 확장할 수 있습니다.

코틀린의 제네릭은 강력하면서도 유연한 기능으로, 타입 안정성을 유지하면서 코드의 재사용성을 높일 수 있습니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코틀린 제네릭 선언  (0) 2024.01.02
코틀린 타입 파라미터  (0) 2024.01.02
코틀린 인터페이스 봉인  (0) 2024.01.02
코틀린 봉인된 클래스  (0) 2024.01.02
코틀린 인터페이스  (0) 2024.01.02