New Score :0
High Score :0
Run Best
NICE BUSINESS TYPE INDICATOR
3. ๊ธ์ ์ ์น๊ตฌ์๊ฒ ๋น๋ ธ๋๋ฐ ์ค๋์ด ๋์ ์ฃผ๊ธฐ๋ก ํ๋ .. ๊ทธ๋ฐ๋ฐ ์นด๋๊ฐ์ ๋ด์ผํ๋ ๋ ๋ ์ค๋์ธ๋ฐ... ์ด๊ฑธ ์ด์ฉ๋...
4. ์ฐ๋ฆฌ ํ์ฌ๋ ์ค์ํ ์์ฌ ๊ฒฐ์ ์ ํ ๋?
5. ์ด์ฌํ ์ผํ ๋๋ฅผ ์ํ ์ ๋ฌผ์ ์ฃผ๊ณ ์ถ๋ค. ์ด๋ค๊ฒ ์ข์๊น?
6. ์ํ์์ ํฌ์์ํ์ ์ถ์ฒ๋ฐ์๋ค. ์ด๋ค๊ฑธ ๊ฐ์ ํ์ง?
7. ํ์ฌ์์์ ๋๋?
8. ๊ฟ์์ ๊นจ์ด๋๋ 20๋ ์ ์ผ๋ก ๋์๊ฐ๋ค. ๋น์ ์ด ์ ์ผ ๋จผ์ ํ๋์ผ์?
9. ๋ด๊ฐ ์ธ์ฌ ๋ด๋น์๋ผ๋ฉด ์ ๊ท ์ ์ฌ์ ์ฑ์ฉ ์ ์ ์ผ ์ค์ํ๊ฒ ๋ณด๋๊ฒ์?
10. ํ์ฌ์ ์ ๋ง ์ซ์ดํ๋ ๋๋ฃ๊ฐ ์๋ค๋ฉด?
11. ๊ฐ๋ํ ์ง์ ๊ฐ์ฅ์ด ๋์๋ค.. ์๋ ์ ์์ผ ๋ ์ ๋ฌผ์?
12. ํ์ ํ์ฌ ์ถ๊ทผ ์คํ์ผ์?
13.ํ์ฌ ์ฒด์ก๋ํ ํ๋ ๋ ์ด๋ค. ์ค๋ ๋ญํ์ง?
14. ๋์ ์ ๋ฌด ์คํ์ผ์?

Kotlin์ inline
ํค์๋: ์๋ฏธ์ ์ต์ ์ ์ฌ์ฉ ์ํฉ ๋ถ์
์ฝํ๋ฆฐ์ inline
ํค์๋๋ ํจ์ ํธ์ถ ์ ๋ฐ์ํ๋ ๋ฐํ์ ์ค๋ฒํค๋๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ์ค๊ณ๋ ๊ธฐ๋ฅ์
๋๋ค. ์ด ํค์๋๋ฅผ ์ ์ฉํ ํจ์๋ ์ปดํ์ผ ์ ํธ์ถ ์ง์ ์ ํจ์ ๋ณธ๋ฌธ์ ์ง์ ์ฝ์
(inline)ํ์ฌ ์คํ ํ๋ฆ์ ์ต์ ํํฉ๋๋ค. ํนํ ๊ณ ์ฐจ ํจ์(higher-order functions)์ ๋๋ค ํํ์์์ ๋ฐ์ํ๋ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํต์ฌ์ ์ธ ์ญํ ์ ํฉ๋๋ค.
์ธ๋ผ์ธ ํจ์์ ์๋ ๋ฉ์ปค๋์ฆ
1. ํจ์ ํธ์ถ ์ค๋ฒํค๋ ์ ๊ฑฐ
์ผ๋ฐ ํจ์ ํธ์ถ์ ์คํ ํ๋ ์ ์์ฑ, ์ ํ ๋ช
๋ น์ด ์คํ, ๋ฐํ ์ฃผ์ ๊ด๋ฆฌ ๋ฑ์ ๊ณผ์ ์ ์๋ฐํฉ๋๋ค. ๋ฐ๋ฉด inline
ํจ์๋ ์ปดํ์ผ๋ฌ๊ฐ ํจ์ ๋ณธ๋ฌธ์ ํธ์ถ ์์น์ ์ง์ ๋ณต์ฌํ๋ฏ๋ก ์ด๋ฌํ ์ค๋ฒํค๋๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด lock()
ํจ์๋ฅผ ์ธ๋ผ์ธ์ผ๋ก ์ ์ธํ๋ฉด ๋ฝ ํ๋/ํด์ ๋ก์ง์ด ํธ์ถ๋ถ์ ์ง์ ์ฝ์
๋์ด ํจ์ ํธ์ถ ๋น์ฉ์ด ์์ด์ง๋๋ค.
inline fun <T> synchronized(lock: Lock, action: () -> T): T {
lock.lock()
try {
return action()
} finally {
lock.unlock()
}
}
2. ๋๋ค ํํ์์ ๊ฐ์ฒด ์์ฑ ์ต์ํ
๊ณ ์ฐจ ํจ์์์ ๋๋ค๋ฅผ ์ธ์๋ก ์ ๋ฌํ ๋๋ง๋ค ์ต๋ช ํด๋์ค ์ธ์คํด์ค๊ฐ ์์ฑ๋ฉ๋๋ค. ์ธ๋ผ์ธ ํจ์๋ ๋๋ค ๋ณธ๋ฌธ๋ ํธ์ถ ์์น์ ์ฝ์ ํ๋ฏ๋ก ์ด๋ฌํ ๊ฐ์ฒด ์์ฑ์ด ๋ฐฉ์ง๋ฉ๋๋ค. 10๋ง ํ ํธ์ถ๋๋ ๋ฃจํ ๋ด๋ถ์์ 1KB ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ์ธ๋ผ์ด๋์ ํตํด ์ด 100MB์ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
3. ๋น๋ก์ปฌ ๋ฐํ(Non-local return) ์ง์
์ธ๋ผ์ธ๋์ง ์์ ๋๋ค๋ return
์ ์ฌ์ฉํด ์ธ๋ถ ํจ์๋ฅผ ํ์ถํ ์ ์์ง๋ง, ์ธ๋ผ์ธ ๋๋ค๋ ํธ์ถ๋ถ์ ์ง์ ์ฝ์
๋๋ฏ๋ก ์ด ์ ์ฝ์ด ์ฌ๋ผ์ง๋๋ค. ์ด๋ ์ปฌ๋ ์
์ฒ๋ฆฌ ํจ์(forEach
)๋ ์ฌ์ฉ์ ์ ์ ์ ์ด ํ๋ฆ ๊ตฌํ์ ํ์์ ์
๋๋ค.
fun findUser(users: List<User>): User? {
users.forEach {
if (it.id == targetId) return it // ์ธ๋ถ ํจ์์์ ๋ฐํ
}
return null
}
์ธ๋ผ์ธ ํจ์์ ์ต์ ์ฌ์ฉ ์ฌ๋ก
1. ๊ณ ์ฐจ ํจ์ ์ฑ๋ฅ ์ต์ ํ
๋๋ค๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์๊ฐ ๋ฐ๋ณต๋ฌธ ๋ด์์ ๋น๋ฒํ ํธ์ถ๋๊ฑฐ๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ ํฉํฉ๋๋ค. ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ repeat
, map
, filter
ํจ์๋ค์ด ๋ํ์ ์ธ ์์์
๋๋ค.
inline fun repeat(times: Int, action: (Int) -> Unit) {
for (index in 0 until times) {
action(index)
}
}
2. Reified ํ์ ํ๋ผ๋ฏธํฐ ํ์ฉ
์ ๋ค๋ฆญ ํ์
์ ๋ฐํ์ ์ ๋ณด์ ์ ๊ทผํด์ผ ํ ๋ reified
ํค์๋์ ์กฐํฉํ์ฌ ์ฌ์ฉํฉ๋๋ค. ๋ฆฌํ๋ ์
์์ด ํ์
์ฒดํฌ(is T
)๋ ํด๋์ค ๋ฆฌํฐ๋ด(T::class
) ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋๋ค.
inline fun <reified T> parseJson(json: String): T {
return Gson().fromJson(json, T::class.java)
}
val user = parseJson<User>(jsonString) // ํ์
์ถ๋ก ๊ฐ๋ฅ
3. ์ธ๋ผ์ธ ํด๋์ค(Inline Classes)์์ ์ฐ๋
value class
๋ก ์ ์ธ๋ ์ธ๋ผ์ธ ํด๋์ค๋ ๋ํผ ํ์
์ ์ค๋ฒํค๋ ์์ด ๊ธฐ๋ณธ ํ์
์ผ๋ก ์ปดํ์ผ๋ฉ๋๋ค. ๋๋ฉ์ธ ํนํ ํ์
(์: UserId
, Email
)์ ์์ ํ๊ฒ ์ฌ์ฉํ๋ฉด์ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
@JvmInline
value class UserId(val value: String)
fun authenticate(id: UserId) { /* ... */ }
์ฃผ์ ์ฌํญ ๋ฐ ์ฌ์ฉ ๊ธ์ง ์ฌ๋ก
1. ๋๊ท๋ชจ ํจ์์ ์ธ๋ผ์ด๋ ํํผ
50์ค ์ด์์ ํจ์๋ฅผ ์ธ๋ผ์ธํ๋ฉด ๋ฐ์ดํธ์ฝ๋ ํฌ๊ธฐ๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํฉ๋๋ค. JVM์ JIT ์ปดํ์ผ๋ฌ ์ต์ ํ๋ฅผ ๋ฐฉํดํ๋ฏ๋ก ๊ฐ๊ฒฐํ ํจ์์๋ง ์ ์ฉํด์ผ ํฉ๋๋ค.
2. ๊ณต๊ฐ API ์ค๊ณ ์ ์ฃผ์
ํผ๋ธ๋ฆญ ์ธ๋ผ์ธ ํจ์๋ ๋ชจ๋ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์ธ๋ผ์ด๋๋๋ฏ๋ก, ๋ด๋ถ(private) ๊ตฌํ์ ์ฐธ์กฐํ ๊ฒฝ์ฐ ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ์ด ๊นจ์ง ์ ์์ต๋๋ค. @PublishedApi
์ด๋
ธํ
์ด์
์ผ๋ก ์ ํ์ ์ผ๋ก ๊ณต๊ฐํด์ผ ํฉ๋๋ค.
3. ์ฌ๊ท ํจ์ ๋ฐ ๋ณต์กํ ์ ์ด ํ๋ฆ
์ธ๋ผ์ธ ํจ์๋ ์ฌ๊ท ํธ์ถ์ ์ง์ํ์ง ์์ผ๋ฉฐ, crossinline
์ผ๋ก ํ์๋์ง ์์ ๋๋ค์์ ๋น๋ก์ปฌ ๋ฐํ์ ์๋ํ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋ณต์กํ ๋ถ๊ธฐ ๋ก์ง์ด ํฌํจ๋ ํจ์๋ ์ธ๋ผ์ด๋์ ํผํด์ผ ํฉ๋๋ค.
inline fun execute(crossinline task: () -> Unit) {
val job = object : Runnable {
override fun run() {
task() // crossinline ์์ผ๋ฉด ์ปดํ์ผ ์ค๋ฅ
}
}
executor.submit(job)
}
์ฑ๋ฅ ๋ฒค์น๋งํฌ ๋น๊ต
๋ค์ ํ๋ 100๋ง ํ ๋ฐ๋ณต ์ ์ธ๋ผ์ธ ์ ์ฉ ์ฌ๋ถ์ ๋ฐ๋ฅธ ์คํ ์๊ฐ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์๋๋ฆฌ์ค | ์ธ๋ผ์ธ ์ ์ฉ ์๊ฐ(ms) | ๋ฏธ์ ์ฉ ์๊ฐ(ms) |
๋จ์ ๋๋ค ํธ์ถ | 12 | 45 |
์บก์ฒ ๋ณ์๊ฐ ์๋ ๋๋ค | 15 | 320 |
reified ํ์ ์ฒดํฌ | 18 | 210 (๋ฆฌํ๋ ์ |
๊ฒฐ๋ก ๋ฐ ๊ถ์ฅ ์ฌํญ
์ธ๋ผ์ธ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํด์ผ ํฉ๋๋ค:
- ๊ณ ๋น๋ ํธ์ถ๋๋ ์์ ๊ณ ์ฐจ ํจ์(3์ค ์ด๋ด)
- ๋๋ค ์บก์ฒ๋ก ์ธํ ๋ฉ๋ชจ๋ฆฌ ๋์ ์ฐ๋ ค ์
- ํ์ ์์ ์ฑ์ ์๊ตฌํ๋ ์ ๋ค๋ฆญ API ์ค๊ณ
- ์ปค์คํ ์ ์ด ํ๋ฆ ์ฐ์ฐ์ ๊ฐ๋ฐ
๋ฐ๋ฉด ํจ์ ๋ณธ๋ฌธ์ด ๋ณต์กํ๊ฑฐ๋, ๋ชจ๋ ๊ฒฝ๊ณ๋ฅผ ๋๋ ๊ณต๊ฐ API๋ฅผ ์ค๊ณํ ๋๋ ์ ์คํ ์ ๊ทผ์ด ํ์ํฉ๋๋ค. noinline
๊ณผ crossinline
์ ์ ์ ํ ์กฐํฉํ์ฌ ๋๋ค ์ธ๋ผ์ด๋์ ์ธ๋ฐํ๊ฒ ์ ์ดํ๋ ๊ฒ์ด ์ฑ๋ฅ๊ณผ ์ ์ง๋ณด์์ฑ ๊ท ํ์ ์ก๋ ํต์ฌ์
๋๋ค.
์ธ๋ผ์ธ ๊ธฐ๋ฅ์ ์ฝํ๋ฆฐ์ด JVM ์ ์ฝ์ ๊ทน๋ณตํ๋ฉด์๋ ๋๋ฉ์ธ ํนํ ์ธ์ด(DSL)์ ๊ฐ์ ์ถ์ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ทผ๊ฐ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋จ์ฉ ์ ์ฝ๋ ํ์ง์ ์ ํ์ํฌ ์ ์์ผ๋ฏ๋ก ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ํ์ฉํ ์ฑ๋ฅ ๊ฒ์ฆ์ด ํ์์ ์ ๋๋ค.