본문 바로가기

Language/Kotlin

[Kotlin] 제너릭

728x90
반응형

클래스 A와 A를 상속받은 클래스 B가 있을 때, 이 두 클래스의 인스턴스를 공용으로 사용하는 하나의 함수에 파라미터로 받으려면?

fun castingExam(var a: A)

수퍼클래스인 A의 자료형으로 받으면 B를 넣어도 A로 캐스팅 되어, 두 클래스 모두 함수의 파라미터로 사용할 수 있다.

하지만 캐스팅 연산을 거치는 것은 프로그램의 속도를 저하시킬 수 있다는 단점이 있다

→ 제너릭을 사용하면 성능 높일 수 있다!!

 

 

제너릭: 클래스나 함수를 선언할 때 고정적인 자료형 대신 실제 자료형으로 대체되는 타입 파라미터를 받아 사용하는 방법 (클래스나 함수에서 사용하는 자료형을 외부에서 지정)

 

  • 타입 파라미터의 이름은 클래스 이름과 규칙이 같지만 일반적으로 ‘Type’의 이니셜인 ‘T’를 사용하는 것이 관례이며 여러개의 제너릭을 사용할 경우 T의 다음 알파벳인 U, V를 추가적으로 사용하기도 한다.
  • 제너릭을 특정한 수퍼 클래스를 상속받은 클래스 타입으로만 제한하려면 <T: 수퍼클래스명>과 같이 쓰면 된다.

제너릭을 클래스에 사용

fun main(){
    UsingGeneric(A()).doShouting()  // A가 소리칩니다
    UsingGeneric(B()).doShouting()  // B가 소리칩니다
    UsingGeneric(C()).doShouting()  // C가 소리칩니다
}

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

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

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

class UsingGeneric<T: A>(val t: T){
    fun doShouting{
        t.shout()
    }
}

 

제너릭을 함수에 사용

fun main(){
    doShouting(B())  // B가 소리칩니다
}

fun <T: A> doShouting(t: T){
    t.shout()
}

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

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

class C: A(){
    override fun shout{
        println("C가 소리칩니다")
    }
}
728x90
반응형

'Language > Kotlin' 카테고리의 다른 글

[Kotlin] 문자열 함수  (0) 2023.09.18
[Kotlin] 컬렉션(1) 리스트  (0) 2023.09.18
[Kotlin] 클래스의 다형성  (0) 2023.09.10
[Kotlin] 익명객체와 옵저버 패턴  (0) 2023.09.09
[Kotlin] 오브젝트  (0) 2023.09.09