[Kotlin] ๐Ÿคš๐Ÿป lateinit vs lazy, ์ •ํ™•ํžˆ ์•„์„ธ์š”?

H43ROยท2021๋…„ 8์›” 31์ผ
38

Kotlin ๊ณผ ์นœํ•ด์ง€๊ธฐ

๋ชฉ๋ก ๋ณด๊ธฐ
8/18
post-custom-banner

Kotlin ์—์„œ์˜ ๋Šฆ์€ ์ดˆ๊ธฐํ™” ๊ธฐ๋ฒ•

๋Šฆ์€ ์ดˆ๊ธฐํ™” ๋ผ ํ•จ์€, ๋ง ๊ทธ๋Œ€๋กœ ๊ฐ์ฒด ์ดˆ๊ธฐํ™”๋ฅผ ๋Šฆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ถ„๋ช… ๋ณ€์ˆ˜ a ๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ธ๋ฐ, a ์˜ ์ฒซ ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ ์–ด๋–ป๊ฒŒ ํ•˜๊ฒ ๋Š”๊ฐ€?
์–ด๋–ค ๊ณ„์‚ฐ ๊ฒฐ๊ณผ ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๋“ฑ์˜ ์ƒํ™ฉ์—์„œ ๋ง์ด๋‹ค. ๊ทธ๋Ÿผ ์šฐ๋ฆฐ ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

var a: String? = null

๊ทธ์น˜๋งŒ ์–ด์ฐจํ”ผ ์ดํ›„์— ๋ถ„๋ช… ์‚ฌ์šฉํ•  ๋…€์„์ธ๋ฐ ๊ตณ์ด ์œ„ํ—˜ํ•˜๊ฒŒ ์ดˆ๊ธฐ ์ƒํƒœ๋กœ null ์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ? ๋ถ„๋ช… null ์‚ฌ์šฉ์˜ ์ง€์–‘์„ ๊ฐ•์กฐํ•˜๋Š” ์ฝ”ํ‹€๋ฆฐ์„ ๋งŒ๋“  ์ฐฝ์‹œ์ž๋“ค๋„ ๋ถ„๋…ธํ•  ๊ฒƒ์ด ๋ป”ํ•˜๋‹ค..

๐Ÿ‘ฎ๐Ÿปโ€โ™€๏ธ : ๊ทธ๋ ‡๊ฒŒ null ์ž์ œ ํ•˜๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ ์ง„์งœ ๊ฐœ ๋ ˆ์ „๋“œ์‹œ๋„ค์š” ใ…‹ใ…‹
๐Ÿฅบ : ๊ทธ๋Ÿผ ๋ญ ์–ด๋–ป๊ฒŒ ํ•˜๋ผ๊ตฌ์š” ๋Œ€์ฒด..
๐Ÿ‘ฎ๐Ÿปโ€โ™€๏ธ : ๋Šฆ์€...
๐Ÿฅบ : ์ด๋ฏธ ๋Šฆ์—ˆ๋‹ค๊ตฌ์š”..?
๐Ÿ‘ฎ๐Ÿปโ€โ™€๏ธ : ์•„๋‹ˆ lateinit ๋ž‘ lazy ์จ์„œ ๋Šฆ์€ ์ดˆ๊ธฐํ™” ํ•˜๋ผ๊ณ ์š”;

๋”ฐ๋ผ์„œ, ์˜ค๋Š˜์€ ๋Šฆ์€ ์ดˆ๊ธฐํ™” ๊ธฐ๋ฒ•์„ ์œ„ํ•œ lateinit ๊ณผ lazy ์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์ž.

lateinit

๋ฐฑ๋ฌธ์ด ๋ถˆ์—ฌ์ผ๊ฒฌ์ด๋‹ค. ์ผ๋‹จ ์ฝ”๋“œ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž.

fun main() {
    lateinit var text: String

    // ๋Œ€์ถฉ ์ค‘๊ฐ„์— ๋ญ”๊ฐ€ ํ–ˆ์Œ
    val result1 = 30

    text = "Result : $result1"
    println(text)

    // ๋Œ€์ถฉ ๋ญ”๊ฐ€ ๋˜ ํ–ˆ์Œ
    val result2 = 50

    text = "Result : ${result1 + result2}"
    println(text)
}

lateinit ์„ ์‚ฌ์šฉํ•˜์—ฌ text ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•ด์คฌ๊ณ , ์ดํ›„์— ์–ด๋–ค ๋™์ž‘์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ text ๋ฅผ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ดํ›„์— ๋˜ ํ•œ ๋ฒˆ ๊ฐ’์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, lateinit ๋ณ€์ˆ˜ ์„ ์–ธ๋ถ€๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด var ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค. lateinit ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Šฆ์€ ์ดˆ๊ธฐํ™” ์ดํ›„์—๋„ ๊ฐ’์ด ๊ณ„์†ํ•˜์—ฌ ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿผ, ๋งŒ์•ฝ lateinit ์„ ์‚ฌ์šฉํ•ด๋†“๊ณ  ๋Šฆ์€ ์ดˆ๊ธฐํ™”์กฐ์ฐจ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property text has not been initialized

์ด๋Ÿฐ์‹์œผ๋กœ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž ์žฌ์  ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•ด์ฃผ๊ธฐ๋„ ํ•œ๋‹ค.

โ›”๏ธ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ์ž ๊น!

lateinit ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ณ„์†ํ•˜์—ฌ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์†์„ฑ์„ ์œ„ํ•ด ๋ฌด์กฐ๊ฑด var ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, Primitive Type (Int, Float, Double, Long ๋“ฑ) ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

by lazy

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

fun main() {
    lateinit var text: String
    val textLength: Int by lazy {
        text.length
    }

    // ๋Œ€์ถฉ ์ค‘๊ฐ„์— ๋ญ”๊ฐ€ ํ–ˆ์Œ
    text = "H43RO_Velog"
    println(textLength)
}

๋ชจ์–‘์ƒˆ๋ฅผ ๋ณด๋‹ˆ, by lazy ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์–ด๋–ค ์ƒ์„ฑ์ž๋ฅผ ๋„ฃ์–ด์ค€ ๋ชจ์–‘์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ž์„ธํžˆ ๋ณด๋ฉด lateinit ์ด๋ผ์„œ ์•„์ง ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š์€ text ์˜ ์†์„ฑ์„ ํ™œ์šฉํ•œ ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

by lazy ๋Š” ์„ ์–ธ ๋‹น์‹œ์—๋Š” ์ดˆ๊ธฐํ™”๋ฅผ ํ•  ๋ฐฉ๋„๊ฐ€ ์—†์ง€๋งŒ, ์ดํ›„์— ์˜์กดํ•˜๋Š” ๊ฐ’๋“ค์ด ์ดˆ๊ธฐํ™” ๋œ ์ดํ›„์— ๊ฐ’์„ ์ฑ„์›Œ๋„ฃ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, 'ํ˜ธ์ถœ ์‹œ'์— ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค„ ์ง€์— ๋Œ€ํ•˜์—ฌ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ text ๊ฐ€ ์ดˆ๊ธฐํ™” ๋œ ์ดํ›„์— textLength ๋ฅผ ์ถœ๋ ฅํ•  ๋•Œ text.length ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ textLength ๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ ์–ธ๋ถ€๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด, val ๋กœ ์„ ์–ธ์ด ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋‹จ ํ•œ ๋ฒˆ์˜ ๋Šฆ์€ ์ดˆ๊ธฐํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ์ดํ›„์—๋Š” ๊ฐ’์ด ๋ถˆ๋ณ€ํ•จ์„ ๋ณด์žฅํ•œ๋‹ค.

๐Ÿ’ก Tip

์•ˆ๋“œ๋กœ์ด๋“œ์—์„  ์ด์ „ ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ๋„˜์–ด์˜จ Intent Bundle Extra ๋“ฑ์„ ํ˜„์žฌ ์•กํ‹ฐ๋น„ํ‹ฐ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— by lazy ๋กœ ๋ฐ›์•„์™€, ์„ ์–ธํ•ด๋‘๊ณ  ์‚ฌ์šฉ ์‹œ์— intent.extra ๋“ฑ์œผ๋กœ ๋ฒˆ๋“ค์„ ๋œฏ์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ํด๋ž˜์Šค ์ „์—ญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ๊ฐ–๊ณ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

ํ•œ ๋ˆˆ์— ๋น„๊ตํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ ๋‘˜ ๋‹ค '๋Šฆ์€ ์ดˆ๊ธฐํ™”' ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๋…€์„์ด๋‹ค. ๋ณธ์งˆ์ ์ธ ๋ชฉ์ ์€ ๋น„์Šทํ•˜๋‹ค.
ํ•˜์ง€๋งŒ ๊ฐ€๋ณ€์„ฑ์— ๊ด€ํ•œ ํŠน์„ฑ์ด ๊ฐˆ๋ฆฌ๋ฉฐ, ์ด์— ๋”ฐ๋ผ ์šฉ๋ฒ•์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๊ฐ’ ๋ณ€๊ฒฝ ใ„ฑใ„ด?
    • lateinit : ์Œ‰๊ฐ€๋Šฅ (var ์‚ฌ์šฉ)
    • by lazy : ใ„ดใ„ด ใ…‹ใ…‹ (val ์‚ฌ์šฉ)
  • ์šฉ๋ฒ• ๊ตฌ๋ถ„
    • lateinit : ์ดˆ๊ธฐํ™” ์ดํ›„์— ๊ณ„์†ํ•˜์—ฌ ๊ฐ’์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ์„ ๋•Œ
    • by lazy : ์ดˆ๊ธฐํ™” ์ดํ›„์— ์ฝ๊ธฐ ์ „์šฉ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ
profile
์–ด๋ ค์šธ์ˆ˜๋ก ๊ธฐ๋ณธ์— ๋ฏธ์น˜๊ณ  ์—ด๊ด‘ํ•˜๋ผ
post-custom-banner

5๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 9์›” 3์ผ

์ด๊ฑฐ ์ •๋ง ์ •ํ™•ํžˆ ์•Œ๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ, ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 9์›” 5์ผ

Java์—์„œ Kotlin์—์„œ ๋„˜์–ด๊ฐ€๋ ค๊ณ  ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ํ•ด๋‹น ๋‚ด์šฉ์„ ์‰ฝ๊ฒŒ ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ด์š” :>

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2022๋…„ 5์›” 18์ผ

์•„ ์ง„์งœ ๋งํˆฌ ๋„ˆ๋ฌด ์žฌ๋ฐŒ์œผ์„ธ์š” ใ…‹ใ…‹ใ…‹ ์ตœ๊ณ  ์ดํ•ด ์™์™

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ