π‘ κ²½λ ν΄λμ€μ ν ννμΈ inline classμ λνμ¬ νμ΅νμμ΅λλ€.
Inline class
- Inline classλ κ²½λ ν΄λμ€μ ν ννλ‘, λ¨μΌ νλ‘νΌν°λ₯Ό κ°μ§κ³ μμΌλ©° λ°νμ μμ μ€μ ν΄λμ€ μΈμ€ν΄μ€λ‘ ν λΉλμ§ μλ νΉμ§μ΄ μμ΅λλ€.
- λμ μ ν΄λΉ ν΄λμ€μ λ¨μΌ νλ‘νΌν°κ° μ§μ μΈλΌμΈλ©λλ€.
- μ΄λ μ±λ₯ ν₯μκ³Ό λΆνμν κ°μ²΄ μμ±μ λ°©μ§ν μ μμ΅λλ€.
νΉμ§
- [λ¨μΌ νλ‘νΌν°] Inline classλ λ°λμ λ¨μΌ νλ‘νΌν°λ₯Ό κ°μ§λλ€.
- [κ²½λμ±] λ°νμ μ κ°μ²΄λ‘ ν λΉλμ§ μκ³ λ¨μΌ νλ‘νΌν° κ°μ΄ μ§μ μ¬μ©λ©λλ€.
- [νμ μμ μ±] μΈλΌμΈ ν΄λμ€λ₯Ό νμ©νλ©΄ μ½λμ λ λͺ νν νμ μ λͺ μν μ μμ΅λλ€.
- [ν¨μμ μ°μ°μ μ€λ²λ‘λ©] λ©μλμ μ°μ°μλ₯Ό μ€λ²λ‘λ© ν μ μμ΅λλ€.
- [μ νμ¬ν] μλμ κ°μ μ ν μ¬νμ κ°μ§λλ€.
- init λΈλ‘μ κ°μ§ μ μμ
- Anyλ₯Ό μμν μ μμΌλ©°, Nullable νμ μ΄ λΆκ°λ₯
High-Order Function?
- μ½νλ¦°μμλ κ³ μ°¨ν¨μλ₯Ό νμ©ν΄μ ν¨μλ₯Ό νΈμΆ μΈμλ‘ μ λ¬νκ±°λ, λ°νκ°μΌλ‘ νμ©ν μ μμ΅λλ€.
- νμ§λ§ ν΄λΉ λ°©μμ λΆκ°μ μΈ λ©λͺ¨λ¦¬ ν λΉμΌλ‘ μΈν΄ λ©λͺ¨λ¦¬ ν¨μ¨μ΄ λλΉ μ§κ³ , ν¨μ νΈμΆλ‘ μΈν λ°νμ μ€λ²ν€λκ° λ°μν©λλ€.
fun load(data: Int, loadData : () -> Unit) : Int {
loadData()
return data
}
fun main() {
val result = load(10) {
print("load data")
}
print(result)
}
- μμ κ°μ κ³ μ°¨ ν¨μλ₯Ό νμ©ν μ½λκ° μλ€κ³ κ°μ ν΄λ³΄κ² μ΅λλ€.
- ν΄λΉ μ½λκ° μ»΄νμΌ μ μ΄λ€ Javaμ½λλ‘ λ³νλλ μ§ νμΈνκΈ° μν΄μ Decompileνμ¬ νμΈνμμ΅λλ€.
public final class MainKt {
public static final int load(int data, Function0<Unit> loadData) {
loadData.invoke();
return data;
}
public static final void main() {
int result = load(10, new Function0<Unit>() {
@Override
public Unit invoke() {
System.out.print("load data");
return Unit.INSTANCE;
}
});
System.out.print(result);
}
}
- loadData μ λλ€μμ μ λ¬ν΄μ£Όλλ‘ κ΅¬νν λΆλΆμμ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν΄μ λ겨주λ μμΌλ‘ λ³νλλ κ²μ νμΈν μ μμμ΅λλ€.
- λν λκΈ΄ κ°μ²΄λ₯Ό ν΅ν΄ ν¨μ νΈμΆμ ꡬννλλ‘ λμ΄μλλ°, μ΄λ¬ν λ°©μμ 무μλ―Έν κ°μ²΄λ₯Ό μμ±νμ¬ λ©λͺ¨λ¦¬λ₯Ό μ°¨μ§νκ³ λ΄λΆμ μΌλ‘ μ°μμ μΈ ν¨μ νΈμΆμ νκ² λ κ°λ₯μ±μ΄ μμ΅λλ€.
- μ΄λ μ€λ²ν€λλ₯Ό λ°μμμΌ μ±λ₯μ λ¨μ΄λ¨λ¦΄ μνμ΄ μ‘΄μ¬ν©λλ€.
- λ°λΌμ μ΄λ¬ν λλ€μ λ΄λΆμ μ½λλ€μ μ»΄νμΌ μ λλ€λ₯Ό νΈμΆνλ λΆλΆμ μ£Όμ νλ λ°©μμ νμ©ν μ μλλ°, μ΄μ Inline Functionμ μ μ©ν μ μμ΅λλ€.
μΈλΌμΈ ν¨μ νμ©
inline class UserId(val id: String)
fun getUser(userId: UserId) {
println("User ID: ${userId.id}")
}
fun main() {
val userId = UserId("12345")
getUser(userId)
}
- UserIdλ μΈλΌμΈ ν΄λμ€μ΄λ©°, id:Strint μ΄λΌλ λ¨μΌ νλ‘νΌν°λ₯Ό κ°μ§λλ€.
- μ΄ λ UserIdλ λ°νμ μ κ°μ²΄λ‘ μ‘΄μ¬νμ§ μκ³ λ¨μΌ νλ‘νΌν° κ°μ΄ μ§μ μ¬μ©λλ©°, μλμ κ°μ μ΄μ μ μ»μ μ μμ΅λλ€.
- [μ±λ₯] κ°μ²΄ μμ± μ€λ²ν€λκ° μμ΄ μ±λ₯μ΄ ν₯μλ©λλ€.
- [λͺ νν νμ ] μ½λμ νμ μμ μ±κ³Ό κ°λ μ±μ λμ¬μ€λλ€.
- [λ©λͺ¨λ¦¬ μ¬μ©λ κ°μ] λΆνμν κ°μ²΄ μμ±μ΄ μ€μ΄λ€μ΄ λ©λͺ¨λ¦¬ μ¬μ©λμ΄ κ°μν©λλ€.
Nullable μΈλΌμΈ ν΄λμ€
- Kotlin 1.5λΆν° @JvmInline μ΄λ Έν μ΄μ μ νμ©νμ¬ nullable μΈλΌμΈ ν΄λμ€λ₯Ό μ μν μ μμ΅λλ€.
@JvmInline
value class UserId(val id: String)
fun getUser(userId: UserId?) {
if (userId != null) {
println("User ID: ${userId.id}")
} else {
println("User ID is null")
}
}
κ³ μ°¨ν¨μμ μΈλΌμΈ ν΄λμ€
- μμμ μμ±ν load() κ³ μ°¨ ν¨μλ₯Ό μΈλΌμΈ ν΄λμ€λ‘ μ μΈνμ λ, μ΄λ€ μ°¨μ΄κ° μλμ§ νμΈν΄λ³΄μμ΅λλ€.
public final class MainKt {
public static final void main() {
System.out.print("load data");
int result = 10;
System.out.print(result);
}
}
- inline ν€μλλ₯Ό μ»΄νμΌνμ¬ μλ° μ½λλ‘ λ³ννλ€λ©΄, load ν¨μκ° μ§μ νΈμΆλμ§ μκ³ load ν¨μμ λ³Έλ¬Έμ΄ main ν¨μμ μ§μ μ½μ λμ΄ ν¨μ νΈμΆμ λν μ€λ²ν€λλ₯Ό μ€μΌ μ μμ΅λλ€.
- μ΄λ° κ²½μ° κ³ μ°¨ ν¨μκ° λΉλ²νκ² νΈμΆλλ κ²½μ°μ μ΅μ νλ₯Ό μ§νν μ μμ΅λλ€.
- μ»΄νμΌλλ λ°μ΄νΈμ½λμ μμ μ¦κ°νμ¬λ, κ°μ²΄λ₯Ό μμ±νκ±°λ ν¨μλ₯Ό λ νΈμΆνλ λ±μ λΉν¨μ¨μ μΈ νλμ νμ§ μκ² λμμ΅λλ€.
noinline Keyword
- μΈλΌμΈ ν¨μλ μΌλ° ν¨μλ³΄λ€ μ±λ₯μ΄ μ’μ§λ§, λ΄λΆμ μΌλ‘ μ½λλ₯Ό 볡μ¬νλ κ°λ μ΄κΈ° λλ¬Έμ μΈμλ‘ μ λ¬λ°μ ν¨μλ λ€λ₯Έ ν¨μλ‘ μ λ¬λκ±°λ μ°Έμ‘°λ μ μμ΅λλ€.
- μλμ μλ₯Ό λ³΄κ² μ΅λλ€.
inline fun load(data: Int, loadData : () -> Unit, loadData2: () -> Unit) : Int {
loadData()
return data
}
fun load2(data: Int, loadData2 : () -> Unit) : Int {
loadData2()
return data
}
fun main() {
load(1, {
print("load Function")
}, {
print("load2 Function")
})
}
- μμμλ μ λ¬λ°μ ν¨μμ μΌλΆλ₯Ό λ€λ₯Έ ν¨μλ‘ λκ²¨μ£Όκ³ μμ΅λλ€.
- μ΄λ μ»΄νμΌ μλ¬λ₯Ό λ°μνκ² λλ©°, μ΄λ νμν κ²μ΄ noninline ν€μλμ νμ©μ λλ€.
inline fun load(data: Int, loadData : () -> Unit, noinline loadData2: () -> Unit) : Int {
loadData()
return data
}
- inlineμμ μ μΈμν¬ μΈμ μμ noinline ν€μλλ₯Ό λΆμ΄λ©΄μ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ΅λλ€.
κ²°λ‘
- inlineμ μΌλ° ν¨μλ³΄λ€ μ’μ μ±λ₯μ κ°μ§λ©°, κ³ μ°¨ν¨μμμ λ°μνλ μ€λ²ν€λλ₯Ό μ€μΌ μ μλ€λ μ₯μ μ κ°μ§κ³ μμ΅λλ€.
- νμ§λ§ μ§λμΉ inline ν¨μμ νμ©μ λ°μ΄νΈμ½λ μμ μ¦κ°μν€λ©° μ΄λ μ±λ₯ μ νλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- inline μ²λ¦¬λ 1~3μ€μ κΈΈμ΄λ₯Ό κΆμ₯νκ³ μμΌλ©°, μ μ νκ² νμ©νλ€λ©΄ λ§€μ° μ’μ μ±λ₯μ μ»μ μ μμ΅λλ€.
μ°Έκ³
https://kotlinlang.org/docs/inline-classes.html
https://medium.com/android-news/learning-kotlin-inline-functions-18a94d3efe46