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 |