App노자
[Kotlin] 제네릭(Generic) 본문
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 |