[Kotlin] 제너릭(Generic) 설명 & 예제

728x90

제너릭

클래스나 함수에서 사용하는 자료형을 외부에서 지정할 수 있는 기능을 말함

ex)
Class A -> Class B(상속 받음)

이 두 클래스의 인스턴스를 공용으로 사용하는 하나의 함수에
패러미터로 받으러면?
Class A(Super Class)
A의 자료형으로 받으면 B를 넣어도 A로 캐스팅 됨, 따라서 두 클래스 모두 함수의 패러미터로 사용 가능함

fun castingExam(var a: A)

But, 캐스팅 연산은 프로그램의 속도를 저하시킬 수 있다는 단점이 있다 -> 제너릭 등장

제너릭은 함수나 클래스를 선언 할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 타입 패러미터를 받아 사용하는 방법입니다.

  • 일반적으로 'Type'의 이니셜인 T를 사용
  • T -> U -> V 순으로 사용
fun main() {
    //UsingGeneric<A>(A()).doShouting() 처럼 수동으로 전달 할 수도 있지만
    //생성자의 파라미터를 통해 클래스 A라는 것을 알 수 있기 때문에 생략

    //class UsingGeneric(val t: A) 로 캐스팅해도 결과 같겠지만 캐스팅 함으로써 성능저하되기 때문에 제너릭 사용한 것
    UsingGeneric(A()).doShouting()
    UsingGeneric(B()).doShouting()
    UsingGeneric(C()).doShouting()

    //캐스팅 없이 B의 객채 그대로 함수에서 사용
    doShouting(B())
}

//제너릭을 함수에 사용
//슈퍼클래스를 A로 제한한 T 선언
//패러미터로는 T에 맞는 인스턴스 t로 받음
fun <T : A> doShouting(t: T) {
    t.shout()
}

//Super Class
open class A {
    open fun shout() {
        println("A가 소리칩니다")
    }
}

class B : A() {
    override fun shout() {
        println("B가 소리칩니다")
    }
}

class C : A() {
    override fun shout() {
        println("C가 소리칩니다")
    }
}

//슈퍼클래스를 A로 제한한 T 선언하고
//생성자에서는 T 맞는 인스턴스를 t 받는다
class UsingGeneric<T : A>(val t: T) {
    fun doShouting() {
        t.shout()
    }
}

 

728x90

댓글

Designed by JB FACTORY