Language/Kotlin

Kotlin 제네릭(Generic)

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
반응형