๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์–ธ์–ด/Kotlin

[Kotlin ๋ฌธ๋ฒ• ์ข…ํ•ฉ] - ์ง€์—ฐ ์ดˆ๊ธฐํ™” (@@0313 ์ถ”๊ฐ€์ค‘~)

by ์ ผ์ ผ39 2024. 3. 6.

 

1. ์ง€์—ฐ ์ดˆ๊ธฐํ™”

    : ํด๋ž˜์Šค ์„ค๊ณ„ ์‹œ ์ดˆ๊ธฐ์˜ ๊ฐ’ ์„ค์ •ํ•˜๊ธฐ ์• ๋งคํ•  ๋•Œ, ๋‚˜์ค‘์— ๋Œ€์ž…

    (+) ๋ฉ”๋ชจ๋ฆฌ์˜ ํšจ์œจ์ ์ธ ์‚ฌ์šฉ

 

1) ๋ณ€์ˆ˜ --> lateinit

    - isInitialized --> ๋ณ€์ˆ˜ ์‚ฌ์šฉ ์ „, ์ดˆ๊ธฐํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด true/false ๋ฐ˜ํ™˜ ( !::name.isInitialized)
    - ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์ฐธ์กฐํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ์— this::~ ๋˜๋Š” :: ๋ถ™์ž„

    // var์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ, ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ๊ฒŒํ„ฐ, ์„ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ(์ดˆ๊ธฐํ™”๋œ ๋’ค์—๋Š” ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๊ธด ํ•œ ๋“ฏ)

fun main(){
    var s1 = Student()
    s1.name = "์ฐธ์ƒˆ" 		//์ด ๋•Œ ์ดˆ๊ธฐํ™”๋จ
    s1.displayInfo()

    s1.age = 10
    s1.displayInfo()
}

class Student {
    lateinit var name:String 		// ์—ฌ๊ธฐ
    var age:Int = 0

    fun displayInfo() {
        if(this::name.isInitialized) { 			//์—ฌ๊ธฐ
            println("์ด๋ฆ„์€: ${name} ์ž…๋‹ˆ๋‹ค.")
            println("๋‚˜์ด๋Š”: ${age} ์ž…๋‹ˆ๋‹ค.")
        } else {
            println("name๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์„ธ์š”.")
    	}
    }
}

 

2) ์ƒ์ˆ˜ --> lazy

    - ์‚ฌ์šฉ ์‹œ์ ์— ๊ฐ’์„ ๋Œ€์ž…ํ•˜๊ณ  ์ดˆ๊ธฐํ™”๋จ         

fun main(){
    var s1 = Student()
    s1.name = "์ฐธ์ƒˆ"
    s1.displayInfo() 		//์ด ๋•Œ ํ•œ๋ฒˆ ์ดˆ๊ธฐํ™”๋จ, address ์ดˆ๊ธฐํ™” ์ถœ๋ ฅ๋œ ํ›„ ์ฃผ์†Œ๋Š” : ~ ์ถœ๋ ฅ๋จ

    s1.age = 10
    s1.displayInfo() 		//์ด ๋• address ์ดˆ๊ธฐํ™” ์ถœ๋ ฅ๋˜์ง€ ์•Š์Œ
}

class Student {
    lateinit var name:String
    var age:Int = 0
    val address: String by lazy { 		// <-- ์—ฌ๊ธฐ
        println("address ์ดˆ๊ธฐํ™”")
        "seoul" 						//์ดˆ๊ธฐํ™”๊ฐ’ ๋„ฃ์–ด์คŒ
    }

    fun displayInfo() {
        println("์ด๋ฆ„์€: ${name} ์ž…๋‹ˆ๋‹ค.")
        println("๋‚˜์ด๋Š”: ${age} ์ž…๋‹ˆ๋‹ค.")
        println("์ฃผ์†Œ๋Š”: ${address} ์ž…๋‹ˆ๋‹ค.")
    }
}
class LazyTest{
    init{
        println("init block")
    }
    val subject by lazy{
        println("lazy initialized")
        "Kotlin Programming" 		//๋ฐ˜ํ™˜๊ฐ’
    }
    fun flow(){
        println("Not initialized")
        println("s1 : $subject") 	//์ตœ์ดˆ ์ดˆ๊ธฐํ™” ์‹œ์ 
        println("s2 : $subject") 	//์ดˆ๊ธฐํ™”๋œ ๊ฐ’ ์‚ฌ์šฉํ•˜๊ธฐ
    }
}

fun main(){
    val test = LazyTest()
    test.flow()    
}
class Person(val name: String, val age : Int)

fun main(){
    var isPersonInstantiated: Boolean = false
    
    val person : Person by lazy{
        isPersonInstantiated = true
        Person("Choi", 22)
    }
    
    val personDelegate = lazy { Person("Lee", 40) } 	//์œ„์ž„๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•œ ์ดˆ๊ธฐํ™”
    
    println("person Init : $isPersonInstantiated")
    println("personDelegate Init: ${personDelegate.isInitialized()}")
    
    println("person.name = ${person.name}") 		//์ด ์‹œ์ ์—์„œ ์ดˆ๊ธฐํ™”๋จ!
    println("personDelegate.value.name = ${personDelegate.value.name}") 	//์ด ์‹œ์ ์—์„œ ์ดˆ๊ธฐํ™”๋จ
    
    println("person Init: $isPersonInstantiated")
    println("personDelegate Init: ${personDelegate.isInitialized()}")
}

//๊ฐ์ฒด์— lazy๊ฐ€ ์„ ์–ธ๋œ ์‹œ์ ์—์„œ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ฝ”๋“œ์˜ ์ ‘๊ทผ ์‹œ์ ์—์„œ ์ดˆ๊ธฐํ™”๋จ

//by lazy -> ๊ฐ์ฒด์˜ ์œ„์ž„
//lazy ํ• ๋‹น -> ๋ณ€์ˆ˜์— ์œ„์ž„๋œ lazy ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ.
                ์ด ๋ณ€์ˆ˜์˜ lazy๋ฅผ ํ•œ ๋‹จ๊ณ„ ๋” ๊ฑฐ์ณ ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„์ธ value.name๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•จ

 

    *by๋ฅผ ์ด์šฉํ•œ ์œ„์ž„

1. ํด๋ž˜์Šค์˜ ์œ„์ž„

interface Animal{
    fun eat(){...}
}

class Cat : Animal{ } 		//์ธํ„ฐํŽ˜์ด์Šค
val cat = Cat() 		//Cat, ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„

class Robot : Animal by cat

Animal์˜ ์ •์˜๋œ Cat์˜ ๋ชจ๋“  ๋ฉค๋ฒ„๋ฅผ Robot์— ์œ„์ž„
Cat์€ Animal์˜ private ๋ฉค๋ฒ„๋กœ Robot ํด๋ž˜์Šค ์•ˆ์— ์ €์žฅ๋จ
Cat์—์„œ ๊ตฌํ˜„๋œ ๋ชจ๋“  Animal์˜ ๋ฉ”์†Œ๋“œ๋Š” ์ •์  ๋ฉ”์†Œ๋“œ๋กœ ์ƒ์„ฑ๋จ
-> Robot ํด๋ž˜์Šค์—์„œ Animal์„ ๋ช…์‹œ์ ์œผ๋กœ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ ๋„ eat()์„ ๋ฐ”๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ

@@275~