Home 제네릭
Post
Cancel

제네릭

Generic(제네릭)

정의

  • 클래스나 함수에서 사용하는 자료형을 외부에서 지정할 수 있는 기능
    • 함수나 클래스를 선언할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 type parameter를 받아 사용

사용방법

  • type parameter의 이름은 ****로 사용
    • 여러 개이면 <T,U,V…>
  • 제너릭을 특정한 수퍼 클래스를 상속받은 클래스 타입으로만 제한하려면 ****

예시

  • fun genericFun(param: T): T
  • class GenericClass (var pref: T)
    • 둘 다 T는 Int 자료형으로 자동으로 추론된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
open class Animal{
    open fun run(){
        println("동물이 달립니다.")
    }
}
class Dog: Animal(){
    override fun run(){
        println("강아지가 달립니다.")
    }
}
class Tiger: Animal(){
    override fun run(){
        println("호랑이가 달립니다.")
    }
}

class UsingGeneric<T: Animal> (val t:T){
    fun running(){
        t.run()
    }
}

//함수 제너릭
fun <T: Animal> running(t:T){
    t.run()
}

fun main(){
    UsingGeneric(Animal()).running()
    UsingGeneric(Dog()).running()
    UsingGeneric(Tiger()).running()
    
    running(Dog())
}

  • 위 코드에서 제너릭을 사용하지 않고 UsingGeneric 생성자에서 class UsingGeneric(val t:A)로 A로 캐스팅하여도 동작은 같다. (다형성에서 배운 내용)
  • 하지만 캐스팅 연산자는 프로그램의 속도를 저하시킨다는 단점이 있어 제너릭을 사용하는 것이 더 좋다.