반응형
제네릭은 클래스 내부에서 사용할 자료형을 나중에 인스턴스를 생성할 때 확정합니다.
제네릭을 사용하면 객체의 자료형을 컴파일할 때 체크하기 때문에 객체 자료형의 안전성을 높이고 형 변환의 번거로움이 줄어듭니다.
예)
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 |
댓글