reified
์ฝํ๋ฆฐ์์ ํค์๋๋ ํ์
์๊ฑฐ(Type Erasure) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก JVM์ ์ปดํ์ผ ์๊ฐ์ ์ ๋ค๋ฆญ ํ์
์ ๋ณด๋ฅผ ์ง์๋ฒ๋ฆฝ๋๋ค. ์ด ๋๋ฌธ์ ๋ฐํ์์ T
๊ฐ ์ด๋ค ํ์
์ธ์ง ์ ์ ์๊ฒ ๋ฉ๋๋ค. reified
๋ ์ด ํ์
์ ๋ณด๋ฅผ ๋ฐํ์์๋ ์ ์ง์์ผ ์ค๋๋ค.
ํ์
์๊ฑฐ(Type Erasure)์ ํ๊ณ
์๋ฐ์ ์ฝํ๋ฆฐ์์ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ์ฃผ๋ ์ด์ ๋ ์ปดํ์ผ ์๊ฐ์ ํ์ ์์ ์ฑ์ ํ๋ณดํ๊ธฐ ์ํจ์ ๋๋ค. ํ์ง๋ง JVM์ ํด๋์ค ํ์ผ์ ๋ก๋ํ ๋ ์ ๋ค๋ฆญ ํ์ ์ ๋ณด๋ฅผ ์ง์๋ฒ๋ฆฌ๋ฏ๋ก, ๋ฐํ์์๋ ์ ๋ค๋ฆญ ํ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋ค์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ด ๋ฌธ์ ๋ฅผ ๋ช ํํ ์ ์ ์์ต๋๋ค.
fun <T> isInstanceOf(item: Any): Boolean {
// ๋ฐํ์์ T์ ํ์
์ ๋ณด๊ฐ ์๊ฑฐ๋์ด is T๋ฅผ ์ฌ์ฉํ ์ ์์
return item is T // โ ๏ธ ์ปดํ์ผ ์๋ฌ!
}
์ ์ฝ๋๋ T
๊ฐ String
์ธ์ง Int
์ธ์ง ๋ฐํ์์ ์ ์ ์์ด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
reified
์ ์ญํ ๊ณผ ์ฌ์ฉ๋ฒ
reified
์ ์ญํ ๊ณผ ์ฌ์ฉ๋ฒreified
๋ **์ธ๋ผ์ธ ํจ์(inline function)**์ ํ์
ํ๋ผ๋ฏธํฐ์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. reified
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์ ๋ค๋ฆญ ํ์
ํ๋ผ๋ฏธํฐ T
๋ฅผ ํด๋น ํ์
์ผ๋ก **"์ค์ฒดํ(reify)"**ํด์ค๋๋ค. ์ฆ, ํจ์๊ฐ ํธ์ถ๋ ๋ ํ์
T
๊ฐ **์ค์ ํ์
(e.g., String, Int)**์ผ๋ก ๋์ฒด๋ฉ๋๋ค.
reified
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฝ๋๋ฅผ ์์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
// reified ํค์๋๋ก T์ ํ์
์ ๋ณด๋ฅผ ์ ์ง
inline fun <reified T> isInstanceOf(item: Any): Boolean {
return item is T
}
fun main() {
val myString = "Hello"
val myNumber = 123
// ๋ฐํ์์๋ ํ์
T๊ฐ String, Int๋ก ์ ์ง๋จ
println(isInstanceOf<String>(myString)) // ์ถ๋ ฅ: true
println(isInstanceOf<Int>(myNumber)) // ์ถ๋ ฅ: true
println(isInstanceOf<String>(myNumber)) // ์ถ๋ ฅ: false
}
์ด์ฒ๋ผ reified
๋ ๋ฐํ์์๋ ์ ๋ค๋ฆญ ํ์
์ ํ์ฉํด์ผ ํ๋ ์ํฉ์์ ๋งค์ฐ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค.
reified
์ ํ์ฉ ์ฌ๋ก
reified
์ ํ์ฉ ์ฌ๋กreified
๋ ํน์ ํ์
์ ๊ฐ์ฒด๋ฅผ ํํฐ๋งํ๊ฑฐ๋, ํด๋์ค ์ธ์คํด์ค๋ฅผ ๋์ ์ผ๋ก ์์ฑํ ๋ ์ ์ฉํ๊ฒ ์ฐ์
๋๋ค.
1. ํ์ ๋ณ ๋ฆฌ์คํธ ํํฐ๋ง
ํน์ ํ์
์ ์์๋ง ๊ฑธ๋ฌ๋ด๊ณ ์ถ์ ๋ reified
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํด์ง๋๋ค.
inline fun <reified T> List<Any>.filterIsInstance(): List<T> {
val result = mutableListOf<T>()
for (item in this) {
if (item is T) {
result.add(item)
}
}
return result
}
fun main() {
val items = listOf("apple", 1, "banana", 2.5, "cherry")
val strings = items.filterIsInstance<String>()
println(strings) // ์ถ๋ ฅ: [apple, banana, cherry]
val doubles = items.filterIsInstance<Double>()
println(doubles) // ์ถ๋ ฅ: [2.5]
}
2. ์กํฐ๋นํฐ ์์
์๋๋ก์ด๋ ๊ฐ๋ฐ์์ startActivity
๋ฅผ ํธ์ถํ ๋ reified
๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค๋ฅผ ์ง์ ๋๊ธฐ์ง ์์๋ ๋ฉ๋๋ค.
// Context ํ์ฅ ํจ์
inline fun <reified T : Activity> Context.startActivity() {
val intent = Intent(this, T::class.java)
startActivity(intent)
}
// ์ฌ์ฉ ์์
// context.startActivity<MainActivity>()
reified
๋ ์ฝํ๋ฆฐ์ ํ์
์๊ฑฐ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๋ ํค์๋๋ก, ํนํ ์ธ๋ผ์ธ ํจ์์ ํจ๊ป ์ฌ์ฉ๋์ด ๋ฐํ์์๋ ์ ๋ค๋ฆญ ํ์
์ ๋ณด๋ฅผ ์ ์งํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ฅผ ํตํด ๋ ์์ ํ๊ณ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ, ํนํ ๋ฆฌํ๋ ์
๊ณผ ๊ฐ์ด ๋ฐํ์ ํ์
์ ๋ณด๊ฐ ํ์์ ์ธ ์ํฉ์์ ๋งค์ฐ ์ ์ฉํ๊ฒ ํ์ฉ๋ฉ๋๋ค. reified
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํด์ง๊ณ ๊ฐ๋
์ฑ์ด ๋์์ง๋ ์ฅ์ ๋ ์์ต๋๋ค.
Last updated