App노자

[Kotlin] 제네릭(Generic) 본문

Android/Kotlin

[Kotlin] 제네릭(Generic)

앱의노예 2023. 6. 18. 18:14

1. 제네릭이란


class Box<T>(t: T) {  // 제네릭을 사용해 형식 매개변수를 받아 name에 저장, 규칙일 뿐 꼭 T가 아니어도 된다
    var name = t
}
fun main() {
    val box1: Box<Int> = Box<Int>(1)
    val box2: Box<String> = Box<String>("Hello")
    val box3 = Box(3)
    // 객체 생성 시 유추될 수 있는 자료형이 있다면 선언된 자료형인 <String>, <Int>는 타입추론을 통해 생략이 가능하다

    println(box1.name)
    println(box2.name)
    println(box3.name)
}

제네릭은 클래스 내부에서 사용할 자료형을 나중에 인스턴스를 생성할 때 확정한다

자료형을 일반화해 내부에서 그 자료형에 맞춰 교체하는 방법으로 형식 매개변수 T를 이용해 다양한 자료형으로 대체할 수 있으며

객체의 자료형을 컴파일할 때 체크하기 때문에 객체 자료형의 안정성을 높이고 형변환의 번거로움이 줄어든다

 

https://kotlinlang.org/docs/generics.html

 

Generics: in, out, where | Kotlin

 

kotlinlang.org

2. 자료형 변환


open class Parent

class Child: Parent()

class Cup<T>
fun main() {

    val obj1: Parent = Child() // Parent 형식의 obj1은 Child로 형 변환될 수 있음
    //val obj2: Child = Parent() // 하위 형식인 Child의 객체 obj2는 Parent로 변환되지 않아 형식 불일치

    //val obj3: Cup<Parent> = Cup<Child>()  // 형식이 일치하지 않음
    //val obj4: Cup<Child> = Cup<Parent>()  // 형식이 일치하지 않음

    val obj5 = Cup<Child>()    // Cup<Child> 형식
    val obj6: Cup<Child> = obj5 // 형식이 일치
}

제네릭클래스는 형식 매개변수를 1개 이상 받는 클래스이다 클래스를 선언할 때 자료형을 특정하지 않고 인스턴스를 생성하는 시점에서 클래스의 자료형을 정하며 클래스 내에 매개변수, 주 생성자, 부생성자에도 형식 매개변수를 사용할 수 있다

일반적으로 상위클래스와 하위 클래스의 선언 형태에 따라 클래스의 자료형을 변환할 수 있지만 제네릭 클래스는 가변성을 지정하지 않으면

형식 매개변수에 상 하위 클래스가 지정되어도 서로 자료형이 변환되지 않는다

 

//class GenericNull<T: Any> {  // 특정 타입을 지정하면 null이 허용되지 않음
class GenericNull<T> { // 기본적으로 null이 허용되는 형식 매개변수
    fun EqualityFunc(arg1: T, arg2: T) {
        println(arg1?.equals(arg2))
    }
}

fun main() {

    val obj = GenericNull<String>() // non-null로 선언됨
    obj.EqualityFunc("Hello", "World") // null이 허용되지 않음

    val obj2 = GenericNull<Int?>() // null가능한 형식으로 선언됨
    obj2.EqualityFunc(null, 10) // null 사용
}

 

 

 

 

 

3. 제네릭 함수


//class GenericNull<T: Any> {  // 특정 타입을 지정하면 null이 허용되지 않음
class GenericNull<T> { // 기본적으로 null이 허용되는 형식 매개변수
    fun EqualityFunc(arg1: T, arg2: T) {
        println(arg1?.equals(arg2))
    }
}

fun main() {

    val obj = GenericNull<String>() // non-null로 선언됨
    obj.EqualityFunc("Hello", "World") // null이 허용되지 않음

    val obj2 = GenericNull<Int?>() // null가능한 형식으로 선언됨
    obj2.EqualityFunc(null, 10) // null 사용
}

'Android > Kotlin' 카테고리의 다른 글

[Kotlin] List  (0) 2023.07.22
[Kotlin] Array 클래스  (0) 2023.07.21
[Kotlin] 클래스와 클래스의 관계  (0) 2023.05.29
[Kotlin] 연산자 오버로딩  (0) 2023.05.28
[Kotlin] 열거형 클래스와 기타 클래스  (0) 2023.05.27