λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ“š Kotlin

[Effective Kotlin] μ•„μ΄ν…œ 47. 인라인 클래슀의 μ‚¬μš©μ„ κ³ λ €ν•˜λΌ

by GroovyArea 2023. 2. 3.

μ΄νŽ™ν‹°λΈŒ 코틀린을 거의 λ‹€ 읽어 κ°„λ‹€.

μ΄νŽ™ν‹°λΈŒ μžλ°”λ‚˜ μ½”ν‹€λ¦°μ΄λ‚˜ λ°±μ—”λ“œμ—μ„œ APIλ₯Ό μ„€κ³„ν•˜λŠ” 것 뿐만 μ•„λ‹ˆλΌ νŠΉμ • λΆ„μ•Όμ˜ μ‚¬μš©μ— κ΅­ν•œλ˜μ§€ μ•Šκ³ , 

μ–Έμ–΄ 자체λ₯Ό μ–΄λ–€μ‹μœΌλ‘œ μž‘μ„±ν•΄μ•Ό ν•˜λŠ”μ§€λ₯Ό μ•Œλ €μ£ΌλŠ” 책이닀.

 

λ‚˜λŠ” μ½”ν‹€λ¦°μœΌλ‘œ 라이브러리λ₯Ό λ§Œλ“€κ³  μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, 

λ°±μ—”λ“œ κ°œλ°œμ— ν•„μš”ν•œ 뢀뢄을 λ”°λ‘œ λ˜μƒˆκΈ°κ³ μž νŠΉμ • μœ μš©ν•œ μ•„μ΄ν…œλ“€λ§Œ λΈ”λ‘œκ·Έμ— μ •λ¦¬ν•œλ‹€.

λ”°λ‘œ κΈ€λ‘œ μ •λ¦¬ν•˜μ§€ μ•Šμ€ λ‚˜λ¨Έμ§€ μ±•ν„°λŠ” 읽어가며 코틀린에 λŒ€ν•΄ 더 κΉŠμ€ 이해λ₯Ό ν•˜λ € λ…Έλ ₯ν•œλ‹€.

 

Inline ν•œμ •μžκ°€ μ°Έ 많이 λ‚˜μ™”λŠ”λ°, 거의 κ³ μ°¨ ν•¨μˆ˜λ‚˜ 탑 레벨 ν•¨μˆ˜μ— 많이 μ‚¬μš©ν•˜λŠ” κ²ƒμœΌλ‘œ ν•™μŠ΅ν–ˆλ‹€.

μ„±λŠ₯적 λΆ€λΆ„μ—μ„œ 객체λ₯Ό λ”°λ‘œ μƒμ„±ν•˜μ§€ μ•Šκ³  ν•¨μˆ˜ λ‚΄λΆ€λ‘œ νŽΈμž…λ˜κΈ°μ— μš°μˆ˜ν•˜λ―€λ‘œ, 인상 κΉŠμ€ κ°œλ…μ΄μ—ˆλ‹€.

 

ν†±λ ˆλ²¨ ν•¨μˆ˜λ‚˜ κ³ μ°¨ ν•¨μˆ˜λ₯Ό μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜λ₯Ό μ œμ™Έν•˜λ©΄ Inline ν•œμ •μžλ₯Ό 잘 μ‚¬μš©ν•˜μ§€ μ•Šμ„ 것이기에, 읽기만 ν•˜λ €λ‹€κ°€ ν΄λž˜μŠ€μ—μ„œμ˜ μ‚¬μš©μ€

μœ μš©ν•˜κ² λ‹€λŠ” 생각을 ν•˜λ©° 정리해본닀.

 

Inline 클래슀

inline class Id(private val value: String) {
	// ....
}

// μ½”λ“œ
val id: Id = Id("hello")

// 컴파일 된 μ½”λ“œ
val id: String = "hello"

μƒμ„±μž ν”„λ‘œνΌν‹°κ°€ ν•˜λ‚˜μΈ ν΄λž˜μŠ€μ— 인라인 ν•œμ •μžλ₯Ό 뢙이면,

ν•΄λ‹Ή 객체λ₯Ό μ‚¬μš©ν•˜λŠ” μœ„μΉ˜κ°€ λͺ¨λ‘ ν”„λ‘œνΌν‹°λ‘œ κ΅μ²΄λœλ‹€!!

 

μ½”λ“œλ‘œμ„œλŠ” νƒ€μž…μ„ μ΄μš©ν•˜κΈ°μ— 가독성과 νƒ€μž… μ•ˆμ •μ„±μ„ 보μž₯ λ°›κ³ ,

μ„±λŠ₯μ μœΌλ‘œλŠ” 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•ŠκΈ°μ—, μΌμ„μ΄μ‘°μ˜ 효과λ₯Ό 얻을 수 μžˆλ‹€.

 

마치 VO 객체λ₯Ό λ³΄λŠ” 것 κ°™λ‹€. μ„±λŠ₯을 곁듀인.

 

μ“‹!!

 

또 ν•˜λ‚˜, 인라인 클래슀의 λ©”μ„œλ“œλŠ” λͺ¨λ‘ 정적 λ©”μ„œλ“œλ‘œ λ§Œλ“€μ–΄μ§„λ‹€.

 

인라인 클래슀 μ‚¬μš© 상황

μΈ‘μ • λ‹¨μœ„λ₯Ό ν‘œν˜„ν•  λ•Œ,

νƒ€μž… 였용으둜 λ°œμƒν•˜λŠ” 문제λ₯Ό 막을 λ•Œ,

 

interface Timer {
	fun callBefore(time: Int, callback: () -> Unit)
}

time의 λ‹¨μœ„κ°€ λͺ…ν™•ν•˜μ§€ μ•Šλ‹€.

μ΄λŸ¬ν•œ APIλŠ” 문제점이 λΆ„λͺ…ν•˜λ‹€.

 

νŒŒλΌλ―Έν„°μ— time. λŒ€μ‹  timeMillis, timeSeconds λΌλŠ” λ„€μ΄λ°μœΌλ‘œ λŒ€μ²΄ν•  수 μžˆλ‹€.

ν•˜μ§€λ§Œ, μ™ΈλΆ€μ—μ„œλŠ” κ·Έλƒ₯ Int κ°’μ΄λ―€λ‘œ 이 μ—­μ‹œ λͺ…ν™•ν•˜μ§€ μ•Šλ‹€.

 

ν•΄μ„œ νƒ€μž…μ— μ œν•œμ„ κ±Έμ–΄λ³Ό 수 μžˆμ„ 것이닀.

inline class Minutes(val minutes: Int) {
	fun toMillis(): Millis = Millis(minutes * 60 * 1000)
}

inline class Millis(val milliseconds: Int) {
	// ...
}

interface User {
	fun decideAboutTime() : Minutes
    fun wakeUp()
}

interface Timer {
	fun callAfter(timeMillis: Millis, callback: () -> Unit)
}

fun setUpWakeUpUser(user: User, timer: Timer) {
	val time = user.decideAboutTime()
    
    timer.callAfter(time.toMillis()) {
    	user.wakeUp()
    }
}

인라인 클래슀둜 λ§€ν•‘ν•˜μ—¬ 

λͺ…ν™•ν•˜κ²Œ μ‹œκ°„μ— λŒ€ν•œ νƒ€μž…μ„ μ§€μ •ν•  수 있게 λ˜μ—ˆλ‹€.

λ¬Όλ‘  λ‚΄λΆ€μ μœΌλ‘œ int 값을 μ‚¬μš©ν•˜κ² μ§€λ§Œ!

 

인라인 ν΄λž˜μŠ€μ™€ μΈν„°νŽ˜μ΄μŠ€

인라인 ν΄λž˜μŠ€λ„ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

ν•˜μ§€λ§Œ, μ΄λŸ¬ν•œ ꡬ성은 인라인으둜 λ™μž‘ν•˜μ§€ μ•ŠλŠ”λ‹€.

νƒ€μž…μ˜ 이점을 ν™œμš©ν•΄ 좔상화λ₯Ό μ§„ν–‰ν–ˆμ§€λ§Œ, 결과적으둜 인라인의 μž₯점을 ν™œμš©ν•˜μ§€ λͺ»ν•˜κΈ° λ•Œλ¬Έμ— μ‚¬μš©ν•˜λŠ” 것은 λ¬΄μ˜λ―Έν•˜λ‹€.

 

정리

인라인 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ μ„±λŠ₯적 μ˜€λ²„ν—€λ“œ 없이 νƒ€μž…μ„ λž˜ν•‘ν•  수 있게 λ˜μ—ˆλ‹€.

νƒ€μž…μ„ 적극 ν™œμš©ν•˜μ—¬ μ½”λ“œμ˜ μ•ˆμ •μ„±μ„ 높이며,

λͺ…ν™•ν•œ νƒ€μž…λ§Œμ„ κ°•μ œν•  수 μžˆκΈ°μ—, μ•žμœΌλ‘œ 적극 μ΄μš©ν•  것 κ°™λ‹€!

λ°˜μ‘ν˜•