Published 2022. 2. 18. 14:40

 

 

1. Lateinit

1) 사용하면, safe call을 쓰지 않을 수 있고

var로 선언된 Class의 Property에만 사용이 가능하다.

null을 불허한다.

class SampleA {
    lateinit var name: String

    init {
        name = "Lionel"
    }

    fun process() {
        name?.plus("messi")
        print("이름의 길이 = ${name?.length}")
        print("이름의 첫 글자 = ${name?.substring(0, 1)}")
    }
}

 

2) 변수 초기화 여부 확인 문법

변수가 초기화 작업이 안 되어 있으면 변수를 썼을 때 문제가 되는데...

변수가 초기화가 됐는지 안 됐는지 확인하는 문법

text 변수 초기화 여부를 체크하는 속성. 되어 있으면 그대로 return함

class LateInitSample{
    lateinit var text: String

    fun getLateInitText(): String{
        if(::text.isInitialized){
            return text
        }else{
            return "기본값"
        }
    }
}
fun main(){
    var lait = LateInitSample()
    lait.text = "초기값"
    println(lait.getLateInitText())
}

 

2. Lazy

1) 읽기 전용 변수인 val를 사용하는 지연 초기화 문법. 성능적인 문제를 고려함.

변수 선언: 메모리 할당 작업이 일어난다.

10만 줄 코드를 작성했을 때, 변수 선언하고 객체 생성한 첫줄에서 이미 memory를 할당하고 있는데

8000번 째 조건이 성립돼서 변수 사용한다. 이럴 때 memory를 미리 생성하고 갖고 있어야 하는지.

 

2) number 변수 접근 시 위의 구문 lazy 지연 초기화 작업 발생.

com 객체가 생성이 되면 Person2 객체 생성. person 객체 생성이 지연 초기화에 의하여 잠시 밀린 상태.

person.name 속성 접근이 시작될 때 지연된 초기화 작업이 발생됨.

fun main(){
    val a: Int = 7

    val number: Int by lazy {
        println("코드를 시작합니다.")
        7
    }

    println("코드를 시작합니다")
    println(number)
    println(number)

    var com = Company()
    com.process()
}

class Company{
    val person: Person by lazy { Person() }

    init {

    }

    fun process(){
        println("${person.name}")
    }
}

3) 주의 사항

지연 초기화는 최초 호출되는 시점에 초기화 작업이 일어남.

resource 발생이 크면 순간적으로 전체 성능에 영향을 줌.

'Language > Kotlin' 카테고리의 다른 글

[Kotlin] Scope 함수  (0) 2022.02.21
[Kotlin] Generic, Null  (0) 2022.02.18
[Kotlin] 추상 Class  (0) 2022.02.17
[Kotlin] 상속과 확장  (0) 2022.02.17
[Kotlin] 함수  (0) 2022.02.17
복사했습니다!