10
10

μ œλ„€λ¦­μŠ€λ₯Ό μ“°λ©΄ νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό λ°›λŠ” νƒ€μž…μ„ μ •μ˜ν•  수 μžˆλ‹€.(List, Map κ³Ό 같은)

코틀린은 값이 λ“€μ–΄μ˜€λŠ” 것에 따라 νƒ€μž…μΈμžλ₯Ό μΆ”λ‘ ν•  수 μžˆλŠ”λ°, 빈리슀트λ₯Ό λ§Œλ“€ κ²½μš°μ—λŠ” νƒ€μž…μΈμžμ˜ νƒ€μž…μ„ λͺ…μ‹œν•΄μ€˜μ•Όν•œλ‹€. μžλ°”μ—μ„œλŠ” μ²˜μŒλΆ€ν„° μ œλ„€λ¦­μ΄ μ—†μ—ˆκΈ°μ— νƒ€μž…μΈμžλ₯Ό λͺ…μ‹œν•˜μ§€μ•Šκ³  μ„ μ–Έν•˜λŠ”κ²Œ κ°€λŠ₯ν•˜μ§€λ§Œ 코틀린은 μ²˜μŒλΆ€ν„° μ œλ„€λ¦­μ΄ λ„μž…λΌμ„œ 좔둠을 ν•˜κ²Œ ν•˜λ˜κ°€, λͺ…μ‹œλ₯Ό ν•΄μ•Όν•œλ‹€.

μ œλ„€λ¦­ ν•¨μˆ˜μ™€ ν”„λ‘œνΌν‹°

λͺ¨λ“  νƒ€μž…μΈμžλ₯Ό κ°–λŠ” 리슀트λ₯Ό λ‹€λ£° 수 μžˆλŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λ©΄, λ°˜λ“œμ‹œ ν˜ΈμΆœμ‹œμ μ— ꡬ체적인 νƒ€μž…μ„ νƒ€μž…μΈμžλ‘œ λ„˜κ²¨μ€˜μ•Όν•œλ‹€. 

fun <T> List<T>.slice(indices: IntRange) : List<T>

λ°˜ν™˜ 값도 μ œλ„€λ¦­, νƒ€μž… μΈμžλ„ μ œλ„€λ¦­μ΄λ‹€. μˆ˜μ‹ κ°μ²΄λ₯Ό μ΄μš©ν•œ ν•¨μˆ˜λ‘œ μ •μ˜λ˜μ–΄ μžˆλ‹€.

 

μ œλ„€λ¦­ ν΄λž˜μŠ€λ„ λ§ˆμ°¬κ°€μ§€λ‘œ <T>λ₯Ό μ΄μš©ν•΄ μ„ μ–Έν•œλ‹€.

interface Comparable<T> {
    fun compareTo(other: T): Int
}

class String : Comparable<String> {
    override fun compareTo(other: String): Int = /*...*/
}

ν΄λž˜μŠ€μ—μ„œ Comparable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ”λ°, T에 String을 λ„£μ–΄μ„œ κ΅¬ν˜„ν–ˆλ‹€.

νƒ€μž… νŒŒλΌλ―Έν„° μ œμ•½

μ–΄λ–€ νƒ€μž…μ„ μ œλ„€λ¦­ νƒ€μž…μ˜ νƒ€μž… νŒŒλΌλ―Έν„°μ— λŒ€ν•œ μƒν•œμœΌλ‘œ μ§€μ •ν•˜λ©΄ κ·Έ μ œλ„€λ¦­ νƒ€μž…μ„ μΈμŠ€ν„΄μŠ€ν™”ν•  λ•Œ μ‚¬μš©ν•˜λŠ” νƒ€μž… μΈμžλŠ” λ°˜λ“œμ‹œ κ·Έ μƒν•œ νƒ€μž…μ΄κ±°λ‚˜ κ·Έ μƒν•œ νƒ€μž…μ˜ ν•˜μœ„ νƒ€μž…μ΄μ–΄μ•Ό ν•œλ‹€. μƒν•œμœΌλ‘œ μ§€μ •ν•œλ‹€λŠ” μ–˜κΈ°λŠ” Number같은 μ΅œμƒμœ„ νƒ€μž…μ„ 지정할 λ•Œλ₯Ό λ§ν•œλ‹€.

fun <T : Number> oneHalf(value: T): Double { 
    return value.toDouble() / 10.0
}

μƒν•œμ„ μ§€μ •ν•˜λ©΄ μ΄λ•ŒλΆ€ν„° TλŠ” μƒν•œνƒ€μž…μœΌλ‘œ λ³€ν•œλ‹€.

 

이런 μ œμ•½μ€ 단일 μ œμ•½μ΄κ³ , μ—¬λŸ¬ μ œμ•½μ„ μ μš©ν•˜κ³  μ‹ΆμœΌλ©΄ νƒ€μž… νŒŒλΌλ―Έν„° μ œμ•½ λͺ©λ‘μ„ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

fun <T> ensureTrailingPeriod(seq: T) 
    where T : CharSequence, T : Appendable { // <- 이 λΆ€λΆ„μ˜ 쑰건 검사가 λͺ©λ‘μ—­ν• ν•¨
    
    }

non-null νƒ€μž…μœΌλ‘œ ν•œμ •ν•˜λŠ” 법도 μžˆλ‹€. μƒν•œμ„ μ •ν•˜μ§€μ•Šμ€ νƒ€μž… νŒŒλΌλ―Έν„°λŠ” Any?κ°€ λ””ν΄νŠΈμΈλ°, 그러면 nullable이 기본이닀. 항상 non-null만 인자둜 λ°›κ²Œν•˜λ €λ©΄ Anyλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ¨μ„œ μƒν•œμ„ μ§€μ •ν•˜λ©΄λœλ‹€.(Anyκ°€ μ•„λ‹ˆμ–΄λ„ non-null type으둜 μƒν•œμ„ μ§€μ •ν•˜λ©΄λœλ‹€.)

그러면 String?, Int?λŠ” Any?의 μžμ†νƒ€μž…μ΄μ§€ Any의 μžμ†νƒ€μž…μ΄ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— null이 λ“€μ–΄μ˜€μ§€ λͺ»ν•˜κ²Œ λ§Œλ“€ 수 μžˆλ‹€.

μ‹€ν–‰ μ‹œ μ œλ„€λ¦­μŠ€ λ™μž‘

JVM의 μ œλ„€λ¦­μŠ€λŠ” νƒ€μž…μ†Œκ±°(type erasure)λ₯Ό μ‚¬μš©ν•΄ κ΅¬ν˜„λœλ‹€. μ‹€ν–‰μ‹œμ μ— μ œλ„€λ¦­ 클래슀의 μΈμŠ€ν„΄μŠ€μ— νƒ€μž…μΈμž 정보가 μ‘΄μž¬ν•˜μ§€μ•ŠλŠ”λ°, 이걸 inlineν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ νƒ€μž…μΈμžκ°€ λŸ°νƒ€μž„μ‹œμ μ— μ§€μ›Œμ§€μ§€ μ•Šκ²Œ ν•˜λŠ” 것을 싀체화(reify)라고 ν•œλ‹€. νƒ€μž…μ†Œκ±°μ˜ μž₯μ μœΌλ‘œλŠ” μ €μž₯ν•΄μ•Όν•˜λŠ” νƒ€μž…μ •λ³΄ 크기가 μ€„μ–΄μ„œ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ€„μΈλ‹€λŠ” 것이 μžˆλ‹€.

μ‹€ν–‰μ‹œμ μ— μ œλ„€λ¦­μŠ€ μΈμŠ€ν„΄μŠ€λŠ” κ·Έ 자체둜만 있고, μ–΄λ–€ μ›μ†Œνƒ€μž…μ„ κ°–λŠ”μ§€λŠ” μ»΄νŒŒμΌλŸ¬κ°€ 잘 보μž₯ν•΄μ€€λ‹€.

 

μ΄λ²ˆμ— ν”„λ‘œμ νŠΈ λ¦¬νŒ©ν† λ§ν•˜λ©΄μ„œ 자주 λ³Έ μ—λŸ¬μΈλ°

if (value is List<String>) { ... }
ERROR: Cannot check for instance of erased type

νƒ€μž…μ†Œκ±°λ‘œ 인해 is κ²€μ‚¬μ—μ„œ νƒ€μž…μΈμžλ‘œ μ§€μ •ν•œ νƒ€μž…μ„ μ‹€ν–‰μ‹œμ μ—μ„œ 검사할 수 μ—†κΈ° λ•Œλ¬Έμ— λ°œμƒν•˜λŠ” μ—λŸ¬λ‹€. 이걸 μ˜¬λ°”λ₯΄κ²Œ 고치렀면 

if (value is List<*>)

νƒ€μž…μΈμž νƒ€μž…μ„ *(μŠ€νƒ€ν”„λ‘œμ μ…˜)으둜 λ°”κΏ”μ•Όν•œλ‹€. as μΊμŠ€νŒ…μ—μ„œλŠ” λΉŒλ“œλŠ” ν—ˆμš©ν•˜μ§€λ§Œ 경고문ꡬ가 unchecked cast라고 λ‚˜μ˜€κΈ΄ν•˜λ‹ˆ μ£Όμ˜ν•΄μ•Όν•œλ‹€.

 

싀체화

μ œλ„€λ¦­ ν•¨μˆ˜μ˜ λ³Έλ¬Έμ—μ„œ κ·Έ ν•¨μˆ˜μ˜ νƒ€μž…μΈμžλ₯Ό κ°€λ¦¬ν‚¬μˆ˜ 있게 ν•˜λŠ” λ°©λ²•μœΌλ‘œ inline ν•¨μˆ˜κ°€ μžˆλ‹€. 이게 인라인 ν•¨μˆ˜κ°€ μœ μš©ν•œ 이유 쀑 ν•˜λ‚˜μΈ νƒ€μž…μΈμž 싀체화이닀.

μ œλ„€λ¦­ ν•¨μˆ˜λ₯Ό 인라인 ν•¨μˆ˜λ‘œ λ§Œλ“€κ³ , νƒ€μž…νŒŒλΌλ―Έν„°λ₯Ό reified둜 μ§€μ •ν•˜λ©΄ μ‹€ν–‰μ‹œμ μ— νƒ€μž… 검사가 κ°€λŠ₯ν•˜λ‹€.

inline fun <reified T> isA(value: Any) = value is T

μ»΄νŒŒμΌλŸ¬λŠ” μΈλΌμΈν•¨μˆ˜μ˜ 본문을 λ°”μ΄νŠΈμ½”λ“œλ‘œ λ³€ν™˜ν•΄μ„œ 호좜 지점에 λ‹€ 뢙여버린닀. μ΄λ•Œ reified된 인자λ₯Ό 호좜 μ§€μ μ—μ„œ λ‹€ μ•Œ 수 있기 λ•Œλ¬Έμ— μ‹€ν–‰μ‹œμ μ— νƒ€μž… 검사가 κ°€λŠ₯ν•˜λ‹€.

 

java.lang.Class νƒ€μž…μΈμžλ₯Ό λ°›λŠ” 경우 싀체화λ₯Ό 자주 μ‚¬μš©ν•œλ‹€.

ClassName::class.java둜 νŒŒλΌλ―Έν„°μ— λ„£λŠ” 경우인데, 이걸 inlineκ³Ό reifiedλ₯Ό μ΄μš©ν•΄ 바꿔보면 μ•„λž˜μ™€ κ°™λ‹€.

inline fun <reified T: Activity> Context.startActivity() {
	val intent = Intent(this, T::class.java)
    startActivity(intent)
}

::λŠ” 클래슀 μ°Έμ‘°ν•  λ–„ μ‚¬μš©ν•˜λŠ”λ°, 10μž₯에 λ¦¬ν”Œλ ‰μ…˜ λ•Œ μžμ„Ένžˆ λ‚˜μ˜¨λ‹€κ³ ν•œλ‹€.

 

싀체화도 ν•˜μ§€ λͺ»ν•˜λŠ” 게 μžˆλ‹€.

  • νƒ€μž… νŒŒλΌλ―Έν„° 클래슀의 μΈμŠ€ν„΄μŠ€ 생성
  • νƒ€μž… νŒŒλΌλ―Έν„° 클래슀의 λ™λ°˜ 객체 λ©”μ†Œλ“œ 호좜
  • μ‹€μ²΄ν™”ν•œ νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό μš”κ΅¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄μ„œ μ‹€μ²΄ν™”ν•˜μ§€ μ•Šμ€ νƒ€μž… νŒŒλΌλ―Έν„°λ‘œ 받은 νƒ€μž…μ„ νƒ€μž… 인자둜 λ„˜κΈ°κΈ°
  • 클래슀, ν”„λ‘œνΌν‹°, 인라인 ν•¨μˆ˜κ°€ μ•„λ‹Œ ν•¨μˆ˜μ˜ νŒŒλΌλ―Έν„°λ₯Ό reified둜 μ§€μ •ν•˜κΈ°(이건 μ–΄λŠ 정도 μ˜ˆμƒν–ˆλ‹€)

λ§ˆμ§€λ§‰ μ œμ•½μ΄ μžˆμœΌλ―€λ‘œ, μ„±λŠ₯μƒμ˜ μ΄μœ λ‚˜ μΈλΌμ΄λ‹λ˜λŠ” κ³Όμ •μ—μ„œ λžŒλ‹€λ₯Ό 인라이닝할 수 μ—†λ‹€λ©΄ noinline을 λΆ™μ—¬μ„œ 인라이닝을 κΈˆμ§€ ν•  수 μžˆλ‹€.

λ³€μ„± variance - 무곡변, 곡변성, λ°˜κ³΅λ³€μ„±

base νƒ€μž…μ΄ κ°™κ³  νƒ€μž…μΈμžκ°€ λ‹€λ₯Έ μ—¬λŸ¬νƒ€μž…μ΄ μ–΄λ–€ 관계에 λ†“μ—¬μžˆλŠ”μ§€ μ•Œμ•„λ³΄λŠ” μ ˆμ΄λ‹€.

μ›μ†Œ 변경이 생긴닀면 List<String> -> List<Any> κ³Όμ •μ—μ„œ νƒ€μž… λΆˆμΌμΉ˜κ°€ 생길 수 μžˆμ–΄μ„œ λΆˆκ°€λŠ₯ν•˜λ‹€. 그게 μ•„λ‹ˆλΌλ©΄ μ•ˆμ „ν•˜λ‹€.

μ œλ„€λ¦­μ΄ μ•„λ‹Œ 클래슀의 경우 νƒ€μž…μ΄ 될 수 μžˆλ‹€. κ·Έ μ˜ˆμ‹œλ‘œ String ν΄λž˜μŠ€λŠ” String, String? 두 νƒ€μž…μ΄ 될 수 μžˆλ‹€. μ œλ„€λ¦­ 클래슀인 경우 νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό ꡬ체적인 νƒ€μž… 인자둜 λ°”κΏ”μ€˜μ•Όν•˜λ©° ListλŠ” νƒ€μž…μ΄ 될 수 μ—†μ§€λ§Œ μ—¬μ „νžˆ 클래슀이고, List<String>κ³Ό 같은 κ²½μš°λŠ” νƒ€μž…μ΄λ‹€.

 

μƒν•œ κ°œλ…μ—μ„œ λ‚΄λ €μ™€μ„œ, μ»΄νŒŒμΌλŸ¬λŠ” λ³€μˆ˜λŒ€μž…/ ν•¨μˆ˜μΈμž 전달 μ‹œ ν•˜μœ„ νƒ€μž…κ²€μ‚¬λ₯Ό 맀번 μˆ˜ν–‰ν•œλ‹€. μ΄λ•Œ λ³΄ν†΅μ˜ κ²½μš°λŠ” ν•˜μœ„νƒ€μž… == ν•˜μœ„ 클래슀 μ΄μ§€λ§Œ(non-null -> nullableκ°€λŠ₯, κ·Έ λ°˜λŒ€λŠ” λΆˆκ°€λŠ₯) μ œλ„€λ¦­ 클래슀의 경우λ₯Ό 보자.

μΈμŠ€ν„΄μŠ€ν™” ν•  λ•Œ MutableList<A> MutableList<B>μ—μ„œ A와 B의 여뢀에 따라 ν•˜μœ„νƒ€μž…κ΄€κ³„κ°€ μ„±λ¦½ν•˜μ§€μ•ŠλŠ” 경우 κ·Έλ•Œ μ œλ„€λ¦­ νƒ€μž…μ„ 무곡변(invariant)이라고 ν•œλ‹€. 

λ‹€μ‹œ λ§ν•˜λ©΄ Bκ°€ A의 ν•˜μœ„νƒ€μž…μ΄μ§€λ§Œ MutableList<B>λŠ” MutableList<A>의 ν•˜μœ„νƒ€μž…μ΄ μ•„λ‹Œ 것을 무곡변이라고 ν•œλ‹€.

List<T>의 κ²½μš°μ—λŠ” μ½”ν‹€λ¦°μ—μ„œ μ½κΈ°μ „μš© μ»¬λ ‰μ…˜μΈλ°, List<A>, List<B>λŠ” ν•˜μœ„νƒ€μž…κ·œμΉ™μ„ μ μš©ν•  수 있고 μ΄λ•ŒλŠ” 곡변(covariant)적이라고 λ§ν•œλ‹€.

 

μ œλ„€λ¦­ 클래슀(μΈν„°νŽ˜μ΄μŠ€λ„ λ‹Ήμ—°νžˆ 포함)κ°€ νƒ€μž… νŒŒλΌλ―Έν„°μ— λŒ€ν•΄ κ³΅λ³€μ μž„μ„ λ‚˜νƒ€λ‚΄λ €λ©΄ νŒŒλΌλ―Έν„° μ•žμ— out을 ν‘œκΈ°ν•΄μ•Όν•œλ‹€. 이게 곡변적이라고 μ„ μ–Έν•˜λŠ” 방법이닀. 

interface Producer<out T> {
    fun produce(): T
}

νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό κ³΅λ³€μ μœΌλ‘œ λ§Œλ“€λ©΄ 이 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό ν•¨μˆ˜ μΈμžλ‚˜ λ°˜ν™˜κ°’μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 게 κ°€λŠ₯해진닀.

λͺ¨λ“  곳에 κ³΅λ³€μ μœΌλ‘œ λ§Œλ“€κ³  μ‹Άμ§€λ§Œ κ³΅λ³€μ μΌλ•Œ μ•ˆμ „ν•˜μ§€ λͺ»ν•œ κ²½μš°κ°€ μžˆλ‹€. νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό κ³΅λ³€μ μœΌλ‘œ μ§€μ •ν•˜λ©΄ 클래슀 λ‚΄λΆ€μ—μ„œ κ·Έ νŒŒλΌλ―Έν„° μ‚¬μš© 방법이 μ œν•œλ˜λŠ”λ°, νƒ€μž… μ•ˆμ „μ„±μ„ μœ„ν•΄μ„œλŠ” 생산(read)으둜 κ³ μ •λ˜κ³  μ†ŒλΉ„(write)κ°€ λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 점이닀.

https://livebook.manning.com/book/kotlin-in-action/chapter-9/17

생산/ μ†ŒλΉ„ 도식이닀. inμ—μ„œ Tνƒ€μž… 값을 μ†ŒλΉ„ν•˜κ³ , outμ—μ„œ Tνƒ€μž… 값을 μƒμ‚°ν•œλ‹€. λ”°λΌμ„œ κ³΅λ³€μ μœΌλ‘œ μ„ μ–Έν•˜λ €λ©΄ outμœ„μΉ˜μ— μ‘΄μž¬ν•˜λŠ” 경우 μ•ˆμ „ν•˜λ‹€.

out ν‚€μ›Œλ“œμ˜ μ˜λ―Έκ°€ 이제 ν™•μ‹€ν•΄μ‘Œλ‹€.

  1. 곡변성
  2. Tλ₯Ό μ•„μ›ƒμœ„μΉ˜μ—μ„œλ§Œ μ‚¬μš©ν•  수 있게 μ‚¬μš©μ œν•œ

μƒμ„±μž νŒŒλΌλ―Έν„°λŠ” in/out μ–΄λŠμͺ½μ—λ„ μ†ν•˜μ§€μ•ŠλŠ”λ‹€. κ·Έ μ΄μœ λŠ” μƒμ„±μžλŠ” μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν• λ•Œ ν˜ΈμΆœλ˜μ§€ κ·Έ 이후 ν˜ΈμΆœν•  수 μžˆλŠ” λ©”μ„œλ“œκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ΄λ‹€. λ‹€λ§Œ μƒμ„±μž νŒŒλΌλ―Έν„°λ₯Ό ν”„λ‘œνΌν‹°λ‘œ λ§Œλ“ λ‹€λ©΄ 그건 in/out에 μ†ν•œλ‹€.

 

또 λ³€μ„±κ·œμΉ™μ€ 클래슀 μ™ΈλΆ€μ—μ„œμ˜ μ•ˆμ „μ„±μ„ ν™•λ³΄ν•˜κΈ° μœ„ν•¨μ΄λ―€λ‘œ public, protected, internal ν΄λž˜μŠ€μ—λ§Œ 적용되고 클래슀 λ‚΄λΆ€μ—λ§Œ μœ νš¨ν•œ privateμ—λŠ” μ μš©λ˜μ§€μ•ŠλŠ”λ‹€.

 

https://livebook.manning.com/book/kotlin-in-action/chapter-9/17

λ°˜κ³΅λ³€μ„±(contravariance)λŠ” 곡변성을 180도 뒀집어 λ‘” 것이닀. 

곡변성이 μƒμ‚°μž(read) κ΄€μ μ—μ„œ λ‚˜μ˜¨κ²ƒμ΄λΌλ©΄ λ°˜κ³΅λ³€μ„±μ€ μ†ŒλΉ„μž(write)관점이닀. λ”°λΌμ„œ inν‚€μ›Œλ“œμ˜ μœ„μΉ˜κ°€ λ°˜κ³΅λ³€μ„±μ˜ 핡심이고 νƒ€μž…μΈμžμ˜ ν•˜μœ„νƒ€μž…κ΄€κ³„κ°€ λ’€μ§‘ν˜€μ„œ μ œλ„€λ¦­ 인자둜 λ“€μ–΄κ°€κ²Œ λœλ‹€.

 

μ§€κΈˆκΉŒμ§€ 클래슀λ₯Ό μ„ μ–Έν•˜λ©΄μ„œ 변성을 μ§€μ •ν–ˆλ‹€. 이걸 선언지점 변성이라고 ν•˜κ³ , νŠΉμ • νƒ€μž… νŒŒλΌλ―Έν„°κ°€ λ‚˜νƒ€λ‚˜λŠ” μ§€μ μ—μ„œ 변성을 κ²°μ •ν•˜λŠ” κ±Έ μ‚¬μš©μ§€μ  변성이라고 ν•œλ‹€.

fun <T> copyData(src: MutableList<out T>)

 ν˜ΈμΆœ 지점에 out을 λΆ™μ—¬μ„œ Tνƒ€μž…μ„ out에 μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œλ§Œ ν˜ΈμΆœν•œλ‹€κ³  선언해버린 μ˜ˆμ‹œλ‹€. μ΄λ•Œ MutableListλŠ” μ œμ•½μ„ 가해진 νƒ€μž…μœΌλ‘œ λ°”λ€Œλ©° 이걸 νƒ€μž… ν”„λ‘œμ μ…˜μ΄λΌκ³  ν•œλ‹€. 

μŠ€νƒ€ ν”„λ‘œμ μ…˜

μ œλ„€λ¦­ νƒ€μž… 인자 정보가 μ—†μŒμ„ ν‘œν˜„ν•˜κΈ° μœ„ν•΄ μŠ€νƒ€ ν”„λ‘œμ μ…˜μ„ μ‚¬μš©ν•˜κ³ , μ›μ†Œ νƒ€μž…μ΄ μ•Œλ €μ§€μ§€ μ•Šμ€ λ¦¬μŠ€νŠΈλŠ” List<*> λΌλŠ” ꡬ문으둜 ν‘œν˜„ν•  수 μžˆλ‹€κ³  μ•žμ„œ μ˜ˆμ‹œλ‘œ λ΄€λ‹€.

μ€‘μš”ν•œ λͺ‡κ°€μ§€λ₯Ό 짚고 κ°€λ©΄ *의 μ •ν™•ν•œ μ˜λ―Έκ°€ μ–΄λ–€ 정해진 νƒ€μž…μ˜ μ›μ†Œλ₯Ό λ‹΄μ§€λ§Œ κ·Έ μ›μ†Œμ˜ νƒ€μž…μ„ μ •ν™•νžˆ λͺ¨λ₯Έλ‹€λŠ” 것이지 MutableList<*> == MutableList<Any?>둜 λŒ€μΉ˜ν•  수 μžˆλŠ” 게 μ•„λ‹ˆλΌλŠ” 점이닀.

fun printFirst(list: List<*>) {  // λͺ¨λ“  ꡬ체적 νƒ€μž…μ˜ 리슀트λ₯Ό 인자둜 받을 수 μžˆλ‹€. 
    if (list.isNotEmpty()) { // isNotEmpty()μ—μ„œλŠ” Tλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€. 
        println(list.first()) // first()λŠ” 이제 Any?λ₯Ό λ°˜ν™˜. 
    }
}

ν”„λ‘œμ μ…˜μ΄ λΆ™λŠ” μ΄μœ λŠ” *κ°€ out Any?처럼 λ™μž‘ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. λ°˜λŒ€λ‘œ inμΌλ•Œ μŠ€νƒ€ν”„λ‘œμ μ…˜μ„ μ§€μ •ν•˜λ©΄ μ†ŒλΉ„λŒ€μƒμ΄ μ–΄λ–€ T인지 μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— in Nothing으둜 μž‘λ™ν•œλ‹€. 또 νƒ€μž… νŒŒλΌλ―Έν„°λ₯Ό μ‹œκ·Έλ‹ˆμ²˜μ—μ„œ μ „ν˜€ μ–ΈκΈ‰ν•˜μ§€ μ•Šκ±°λ‚˜ λ°μ΄ν„°λ₯Ό μ½κΈ°λŠ” ν•˜μ§€λ§Œ κ·Έ νƒ€μž…μ—λŠ” κ΄€μ‹¬μ΄ μ—†λŠ” κ²½μš°μ™€ κ°™μ΄ νƒ€μž… μΈμž μ •λ³΄κ°€ μ€‘μš”ν•˜μ§€ μ•Šμ„ λ•Œλ„ μŠ€νƒ€ ν”„λ‘œμ μ…˜ κ΅¬λ¬Έμ„ μ‚¬μš©ν•  μˆ˜ μžˆλ‹€.

λ°˜μ‘ν˜•

'πŸ“–πŸ–‹οΈ > μ½”ν‹€λ¦° 인 μ•‘μ…˜πŸ“–' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

Kotlin in action(5)  (0) 2023.10.10
Kotlin in action(4)  (0) 2023.10.10
Kotlin in action(3)  (0) 2023.10.10
Kotlin in action(2)  (0) 2023.10.10
Kotlin in action(1)  (0) 2023.10.10
COMMENT