728x90
반응형
- 클래스를 설계할 때 변수의 타입을 유동적으로 하고 싶을 때가 있을 수도 있다. (인자의 자료형을 고정할 수 없거나 예측할 수 없을때)
- 이 때 Generic 개념을 활용하면 클래스 작성시가 아닌 객체 생성시에 변수의 타입을 설정할 수 있다.
1. 제네릭의 일반적인 사용법
형식 매개변수
1. 제네릭 클래스
2. 자료형 변환
제네릭 클래스는 가변성을 지정하지 않으면 형식 매개변수에 상/하위 클래스가 지정되어도 서로 자료형이 변환되지 않는다
3. 형식 매개변수의 null 제어
4. 제네릭 함수 혹은 메서드
5. 젠네릭과 람다식
class TestClassA{
fun testMethod(a1:Int){
println("a1 : $a1")
}
}
class TestClassB{
fun testMethod(a1:String){
println("a1 : $a1")
}
}
class TestClass1<T>{
fun testMethod1(a1:T){
println("a1 : $a1")
}
}
class TestClassC(var a1: String){
fun testMethod(a1:String){
println("a1 : $a1")
}
}
class TestClass2<T>(var a1 : T){
fun testMethod2(a2 : T){
println("a1 : $a1")
println("a2 : $a2")
}
}
class TestClass3<A, B>{
fun testMethod3(a1:A, a2:B){
println("a1 : $a1")
println("a2 : $a2")
}
}
class TestClass4<A, B, C, D>(var a1:A, var a2:B){
fun testMethod4(a3:C, a4:D){
println("a1 : $a1")
println("a2 : $a2")
println("a3 : $a3")
println("a4 : $a4")
}
}
2. 자료형 제한하기
1. 클래스에서 형식 매개변수의 자료형 제한하기
2. 함수에서 형식 매개변수의 자료형 제한하기
3. 다수 조건의 형식 매개변수 제한하기
3. 상/하위 형식의 가변성
1. 클래스와 자료형
2. 가변성의 3가지 유형
가변성
- 불변성 : 제네릭이 설정된 객체의 주소 값을 같은 타입의 제네릭이 설정된 변수에만 담을 수 있다.
- 공변성 : 제네릭이 설정된 객체의 주소 값을 부모 클래스 타입의 제네릭이 설정된 변수에도 담을 수 있다(out)
- 반 공변성 : 제네릭이 설정된 객체의 주소 값을 자식 클래스 타입의 제네릭이 설정된 변수에도 담을 수 있다(in)
open class SuperClass1
open class SubClass1 : SuperClass1()
class SubClass2 : SubClass1()
// 불변성
class TestClass5<A>()
// 공변성
class TestClass6<out A>()
// 반 공변성
class TestClass7<in A>()
3. 무변성
4. 공변성
5. 반공변성
6. 공변성에 따른 자료형 제한하기
4. 자료형 프로젝션
1. 가변성의 2가지 방법
2. 사용지점 변성과 자료형 프로젝션
3. 스타 프로젝션
4. 자료형 프로젝션의 정리
종류 | ex | 가변성 | 제한 |
out 프로젝션 | Box<out Cat> | 공변성 | 형식 매개변수는 Setter(세터)를 통해 값을 설정하는 것이 제한된다 |
in 프로젝션 | Box<in Cat> | 반공변성 | 형식 매개변수는 Getter(게터)를 통해 값을 읽거나 반환할 수 있다. |
스타 프로젝션 | Box<*> | 모든 인스턴스는 하위형식이 될수있다. |
in 과 out 사용 방법에 따라 결정된다. |
5. reified(구체화된) 자료형
reified 사용 사례
728x90
반응형
'Language > Kotlin' 카테고리의 다른 글
Kotlin 파일 입출력 (io/nio) (0) | 2022.01.13 |
---|---|
Kotlin 컬렉션(List/Set/Map)과 확장함수/시퀀스 (0) | 2022.01.13 |
Kotlin 표준(Scope)함수: apply, also, with, run, let (0) | 2021.05.13 |
Kotlin 배열(Array), 문자열(String) (0) | 2021.04.06 |
[Kotlin 함수형 (2)] 연산자 오버로딩 - inline(인라인), infix(중위) (0) | 2021.04.06 |