[Kotlin ๊ธฐ์ดˆ] ์ฝ”ํ‹€๋ฆฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• - ์ง€์—ฐ ์ดˆ๊ธฐํ™”
๋ฐ˜์‘ํ˜•

 

 

 

9 ์ง€์—ฐ ์ดˆ๊ธฐํ™” (lateinit, lazy)

 

 

lateinit

  • ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ํด๋ž˜์Šค ์•ˆ์—์„œ ๋ณ€์ˆ˜๋งŒ Nullable๋กœ ๋ฏธ๋ฆฌ ์„ ์–ธํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋ฅผ ๋‚˜์ค‘์— ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ
  • ์ด๋Ÿด ๊ฒฝ์šฐ lateinit ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉ

 

 

Nullable๋กœ ์„ ์–ธํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•

class Person {
    var name: String? = null
    init {
        name = "Lionel"
    }
    fun process() {
        name?.plus(" Messi")
        print("์ด๋ฆ„์˜ ๊ธธ์ด = ${name?.length}")
        print("์ด๋ฆ„์˜ ์ฒซ ๊ธ€์ž = ${name?.substring(0, 1)}")
    }
}
  • ์ผ๋ฐ˜์ ์ธ ์„ ์–ธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜์Œ์— ?๋กœ null ๊ฐ’์„ ์ž…๋ ฅํ•ด๋‘๊ณ , ํด๋ž˜์Šค์˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ ์˜์—ญ์—์„œ ๊ฐ’์„ ์ž…๋ ฅ
  • ๋ณ€์ˆ˜์— ์ž…๋ ฅ๋œ ๊ฐ’์˜ ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Safe Call(?.)์ด ๋‚จ์šฉ๋˜์–ด ๊ฐ€๋…์„ฑ์„ ๋–จ์–ดํŠธ๋ฆฌ๋Š” ๊ฒŒ ๋ฌธ์ œ์ 

 

 

lateinit์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

class Person {
    lateinit var name: String
    init {
        name = "Lionel"
    }
    fun process(){
        name.plus(" Messi")
        print("์ด๋ฆ„์˜ ๊ธธ์ด = ${name.length}")
        print("์ด๋ฆ„์˜ ์ฒซ ๊ธ€์ž = ${name.substring(0, 1)}")
    }
}
  • lateinit์„ ์‚ฌ์šฉํ•˜๋ฉด Safe Call์„ ์“ฐ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋งŽ์€ ?๋ฅผ ๋ฐฉ์ง€, ๊ฐ€๋…์„ฑ Good
  • lateinit์˜ ํŠน์ง•
    (1) var๋กœ ์„ ์–ธ๋œ ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    (2) null์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ
    (3) ๊ธฐ๋ณธ ์ž๋ฃŒํ˜• Int, Long, Double, Float ๋“ฑ์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
  • lateinit์„ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์ 
    - lateinit์€ ๋ณ€์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์„ ์–ธ๋งŒ ํ•ด ๋†“์€ ๋ฐฉ์‹
    - ๋”ฐ๋ผ์„œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด null ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด์„œ ์•ฑ์ด ์ข…๋ฃŒ๋จ
    - ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, Nullable์ด๋‚˜ ๋นˆ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ

 

 

Lazy

class Company {
    val person: Person by lazy { Person() }
    init {
        // lazy๋Š” ์„ ์–ธ ์‹œ์— ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™” ๊ณผ์ •์ด ํ•„์š” ์—†์Œ
    }
    fun process(){
        print("person์˜ ์ด๋ฆ„์€ ${person.name}") // ์ตœ์ดˆ ํ˜ธ์ถœํ•˜๋Š” ์‹œ์ ์— ์ดˆ๊ธฐํ™”
    }
}
  • lazy๋Š” ์ฝ๊ธฐ ์ „์šฉ ๋ณ€์ˆ˜์ธ val์„ ์‚ฌ์šฉํ•˜๋Š” ์ง€์—ฐ ์ดˆ๊ธฐํ™”
  • lateinit์ด ์ž…๋ ฅ๋œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด, lazy๋Š” ์ž…๋ ฅ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Œ
  • val๋กœ ๋ณ€์ˆ˜๋ฅผ ๋จผ์ € ์„ ์–ธํ•œ ํ›„ ์ฝ”๋“œ์˜ ๋’ค์ชฝ์— by lazy ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋จ
    ๊ทธ๋ฆฌ๊ณ  by lazy ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ์ค‘๊ด„ํ˜ธ { }์— ์ดˆ๊ธฐํ™”ํ•  ๊ฐ’์„ ์จ์ฃผ๋ฉด ๋จ
  • ์„ ์–ธ ์‹œ์— ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋”ฐ๋กœ ์ดˆ๊ธฐํ™” ํ•  ํ•„์š”๊ฐ€ ์—†์Œ
  • ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์˜ ํƒ€์ž…์„ ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜์˜ ํƒ€์ž…์€ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Œ
  • ์ดˆ๊ธฐํ™” ์‹œ์ : lazy๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๊ฐ€ ์ตœ์ดˆ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— by lazy{} ์•ˆ์— ๋„ฃ์€ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
    ์˜ˆ์‹œ์—์„œ Company ํด๋ž˜์Šค๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜๋”๋ผ๋„ person์— ๋ฐ”๋กœ Person()์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ , process ๋ฉ”์„œ๋“œ์—์„œ person.name์ด ํ˜ธ์ถœ๋˜๋Š” ์ˆœ๊ฐ„ ์ดˆ๊ธฐํ™”

 

 

 

๐Ÿ’ก lazy ์‚ฌ์šฉ์— ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ์ด์œ 

  • ์ง€์—ฐ ์ดˆ๊ธฐํ™”๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ตœ์ดˆ ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ์ผ์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐํ™” ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด(๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์“ฐ๊ฑฐ๋‚˜ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•œ ๊ฒฝ์šฐ), ์ „์ฒด ์ฒ˜๋ฆฌ ์†๋„์— ๋‚˜์œ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Œ
  • ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ Company ํด๋ž˜์Šค์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” Person ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•˜๋ฉด ๋‹จ์ˆœํžˆ person.name์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์ˆ˜ ์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜๋„ ์žˆ์Œ
  • ๋”ฐ๋ผ์„œ ๋ณต์žกํ•œ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค๋ผ๋ฉด ๋ฏธ๋ฆฌ ์ดˆ๊ธฐํ™” ํ•ด๋†“๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ 

 

๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T