728x90
μ λλ¦μ΄ νμν μ΄μ
- ν΄λμ€ Aμ μ΄λ₯Ό μμλ°μ ν΄λμ€ Bκ° μλ€.
- λ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό 곡μ©μΌλ‘ μ¬μ©νλ νλμ ν¨μμ νλΌλ―Έν°λ‘ λ°μΌλ €λ©΄ μ΄λ»κ² ν΄μΌν κΉ?
- μνΌν΄λμ€μ μλ£νμΈ Aμ μλ£νμΌλ‘ λ°μΌλ©΄ Bλ μλμΌλ‘ Aλ‘ μΊμ€ν λλ€. β‘οΈ λ ν΄λμ€ λͺ¨λ ν¨μμ νλΌλ―Έν°λ‘ μ¬μ©κ°λ₯νλ€.
- νμ§λ§ μΊμ€ν μ°μ°μ κ±°μΉλκ²μ νλ‘κ·Έλ¨μ μλλ₯Ό μ νμν¨λ€. μ΄λ₯Ό μ λλ¦μ΄ 보μν΄ μ€ μ μλ€.
fun castingExam(var a: A) // Bλ₯Ό λ£μ΄λ Aλ‘ μΊμ€ν
λλ€.
μ λλ¦
- ν΄λμ€λ ν¨μμμ μ¬μ©νλ μλ£νμ μΈλΆμμ μ§μ ν μ μλ κΈ°λ₯μ΄λ€.
- ν¨μλ ν΄λμ€λ₯Ό μ μΈν λ κ³ μ μ μΈ μλ£ν λμ μ€μ μλ£νμΌλ‘ λ체λλ νμ νλΌλ―Έν°λ₯Ό λ°μ μ¬μ©νλ λ°©λ²μ΄λ€.
- νμ νλΌλ―Έν°μ νΉμ μλ£νμ΄ ν λΉλλ©΄ μ λλ¦μ μ¬μ©νλ λͺ¨λ μ½λλ ν λΉλ μλ£νμΌλ‘ λ체λμ΄ μ»΄νμΌλλ€.
- μΊμ€ν μ°μ°μμ΄λ μλ£νμ κ·Έλλ μ¬μ©ν μ μλ€.
νμ νλΌλ―Έν°
- νμ νλΌλ―Έν°μ μ΄λ¦μ ν΄λμ€ μ΄λ¦κ³Ό κ·μΉμ΄ κ°μ§λ§ μΌλ°μ μΌλ‘ 'Type'μ 첫κΈμμΈ 'T'λ₯Ό μ¬μ©νλκ²μ΄ κ΄λ‘λ€.
- μ¬λ¬κ°μ μ λλ¦μ μ¬μ©ν κ²½μ° Tμ λ€μ μνλ²³μΈ Uμ Vλ₯Ό μΆκ°μ μΌλ‘ μ¬μ©ν μ μλ€.
<T, U, V>
- μ λλ¦μ νΉμ ν μνΌν΄λμ€λ₯Ό μμλ°μ ν΄λμ€ νμ μΌλ‘λ§ μ ννλ €λ©΄ μ½λ‘ λ€μ μνΌν΄λμ€μ μ΄λ¦μ μ μ΄μ£Όλ©΄ λλ€.
<T: SuperClass>
μ λλ¦ μ¬μ©λ°©λ²
- ν¨μμμ μ λλ¦μ μ μΈν κ²½μ°
- μΌλ°μ μΈ ν¨μμ²λΌ μ¬μ©νλ©΄ νλΌλ―Έν°κ° λ°ννμ ν΅ν΄ νμ νλΌλ―Έν°λ₯Ό μλμΌλ‘ μΆλ‘ ν΄μ€λ€.
fun<Int> genericFunc(param: Int){} // μ μ 리ν°λ΄μ΄λ Int νμ
μΌλ‘ μΆμ νλ€.
- ν΄λμ€μμ μ λλ¦μ μ μΈν κ²½μ°
- μΈμ€ν΄μ€λ₯Ό λ§λ€ λ νμ νλΌλ―Έν°λ₯Ό μλμΌλ‘ μ§μ νκ±°λ
- μμ±μμ μ λλ¦μ΄ μ¬μ©λ κ²½μ° μ§μ νμ§ μμλ μλμΌλ‘ μΆλ‘ λλ€.
class GenericClass<Int>() // νμ
νλΌλ―Έν°λ₯Ό Intλ‘ μλ μ§μ
class GenericClass<T>(var pref: T)
GenericClass(1) // Intλ‘ μ§μ νμ§ μμλ μλμΌλ‘ Intλ‘ μΆμ
μμ
fun main(){
// νλΌλ―Έν°λ₯Ό ν΄λμ€ Aμ μΈμ€ν΄μ€λ‘ λ겨μ€λ€.
// νμ
νλΌλ―Έν°λ₯Ό μλμΌλ‘ μ λ¬ ν μ μμ§λ§ μμ±μμ νλΌλ―Έν°λ₯Ό ν΅ν΄ ν΄λμ€ AλΌλκ±Έ μΆλ‘ ν μ μκΈ° λλ¬Έμ μλ΅ κ°λ₯νλ€.
UsingGeneric(A()).doShouting()
UsingGeneric(B()).doShouting()
UsingGeneric(C()).doShouting()
// ν¨μλ μ λλ¦ νμ
μ μλμΌλ‘ μΆλ‘ ν μ μκΈ° λλ¬Έμ νμ
νλΌλ―Έν°λ₯Ό μλ΅ κ°λ₯νλ€.
// μΊμ€ν
μμ΄ Bμ κ°μ²΄ κ·Έλλ‘ ν¨μμμ μ¬μ©νλ€.
doShouting(B())
}
// μνΌν΄λμ€
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){ // μνΌν΄λμ€λ₯Ό Aλ‘ μ νν μ λλ¦ T μ μΈ, μμ±μμμλ μ λλ¦ Tμ λ§λ μΈμ€ν΄μ€λ₯Ό μμ± tλ‘ λ°μ
fun doShouting(){
t.shout()
}
}
// μνΌν΄λμ€λ₯Ό Aλ‘ μ νν μ λλ¦ Tλ₯Ό μ μΈνλ€.
// νλΌλ―Έν°λ μ λλ¦ Tμ λ§λ μΈμ€ν΄μ€ tλ₯Ό λ°λλ€.
fun<T:A>doShouting(t:T){}
UsingGeneric μμ±μμμ μνΌν΄λμ€μΈ Aλ‘ μΊμ€ν (class UsingGeneric(val t: A)νμ¬ νΈμΆνμ¬λ λμμ κ°λ€.
νμ§λ§ μ λλ¦μ μ¬μ©νλ κ²½μ° μ λλ¦μ΄ μλ£νμ λ체νκ² λμ΄ μΊμ€ν μ λ°©μ§ν μ μμΌλ―λ‘ μ±λ₯μ λ λμΌ μ μλ€.
π‘μ λλ¦μ λ§μ κΈ°λ³Έ ν΄λμ€μμλ μ¬μ©λλ€.
728x90
'μλλ‘μ΄λπ€' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μ½νλ¦°] null μ²΄ν¬ & λ³μ λμΌμ± μ²΄ν¬ (0) | 2024.07.03 |
---|---|
[μ½νλ¦°] λ¬Έμμ΄μ λ€λ£¨λ μ¬λ¬κ°μ§ λ°©λ² (0) | 2024.07.02 |
[μ½νλ¦°] ν΄λμ€ λ€νμ± (0) | 2024.07.02 |
[μ½νλ¦°] μ€λΈμ νΈ & μ΅μ λ² ν¨ν΄ (0) | 2024.06.27 |
[μ½νλ¦°] μ€μ½ν ν¨μ (0) | 2024.06.27 |