본문 바로가기
Do it 코틀린 프로그래밍

코틀린 제네릭

by 차누감 2020. 8. 20.

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

제네릭을 사용하면 객체의 자료형을 컴파일할 때 체크하기 때문에 객체 자료형의 안전성을 높이고 형 변환의 번거로움이 줄어듭니다.

 

예)

class Box<T>(t:T){  //  형식 매개변수로 받은 인자를 name에 저장
    var name=t
}
fun main(){
    val box1: Box<Int> = Box<Int>(1)
    val box2: Box<String> = Box<String>("Hello")
    
    println(box1.name)  //  1
    println(box2.name)  //  Hello
}

제네릭에서 사용하는 형식 매개변수 이름

형식 매개변수 이름 의미
E 요소(Element)
K 키(Key)
N 숫자(Number)
T 형식(Type)
V 값(Value)
S, U, V etc 두 번째, 세 번째, 네 번째 형식(2nd, 3rd, 4th types)

제네릭 클래스

주 생성자나 부 생성자에 형식 매개변수를 지정해 사용할 수 있습니다.

class MyClass<T>(val myProp: T){}   //  주 생성자의 프로퍼티

class MyClass<T>{
    val myProp: T   // 프로파티
    constructor(myProp: T){ //  부 생성자 이용
        this.myProp=myProp
    }
}


//오류 상황
class MyClass<T>{
    val myProp: T   // 오류! 프로퍼티는 초기화되거나 abstract로 선언되어야 함
}

 

형식 매개변수에 null이 가능한 제네릭 클래스

class GenerucNull<T>{   //  기본적으로 null이 혀용되는 형식
    fun EqualityFunc(arg1: T, arg2: T){
        println(arg1?.equals(arg2))
    }
}
fun main(){
    val obj = GenerucNull<String>() //  non-null로 선언됨
    obj.EqualityFunc("Helllo","World")  //  null이 허용되지 않음
    
    val obj2 = GenerucNull<Int?>()  //  null이 가능한 형식으로 선언됨
    obj2.EqualityFunc(null,10)  //  null 사용
}

null을 허용하지 않으려면 Any 자료형 사용

class GenerucNull<Any>{   //  자료형 Any가 지정되어 null을 허용하지 않음
   ...
}

val obj2 = GenerucNull<Int?>()  //  오류! null이 허용되지 않음

 

제네릭 메서드

fun <T> genericFunc(arg: T): T? {...}	//	매개변수와 반환 자료형에 형식 매개변수 T가 사용됨
fun <K, V> put(key: K, value: V): Unit{...}	//	형식 매개변수가 2개인 경우

 

배열의 인덱스 찾기

fun <T> find(a: Array<T>, Target: T): Int{
    for(i in a.indices){
        if(a[i] == Target) return i
    }
    return -1
}
fun main(){
    val arr1: Array<String> = arrayOf("Apple", "Banana", "Cherry", "Durian")
    val arr2: Array<Int> = arrayOf(1,2,3,4)

    println("arr.indices ${arr1.indices}")  //  indices는 배열의 유효 범위 반환   //  arr.indices 0..3
    println(find<String>(arr1, "Cherry"))   //  요소 C의 인덱스 찾기    //  2
    println(find(arr2,2))   //  요소 2의 인덱스 찾아내기  //  1
}

'Do it 코틀린 프로그래밍' 카테고리의 다른 글

코틀린 문자열  (0) 2020.08.22
코틀린 배열  (0) 2020.08.21
코틀린 상속과 다형성  (2) 2020.08.19
코틀린 클래스와 객체의 정의  (0) 2020.08.18
코틀린 흐름 중단과 변환  (7) 2020.05.23

댓글