ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • kotlin lateinit, lazy by
    개발/안드로이드 2021. 6. 5. 14:59

    자바에서 흔히 보게 되는 NullPointerException 문제를 예방하고자 코틀린에서는 변수 선언에서부터 Nullable 변수의 선언부터 엄격하게 관리한다. 변수를 선언 할 때도 Nullable인지 아닌지를 구분해야하고 Nullable인 경우에는 변수를 호출하는 코드에서 Nullsafe 지시자를 표시해야하며 그렇지 않으면 컴파일 단계에서 에러를 발생시킨다.

     

    var name: String? = null 
    name = "abcd"
    name?.length() // name이 여전히 null 일 가능성이 존재하므로, null safe 접근만 허용된다
    
    var name2: String = "abcd"
    name2 = null // name2가 nullable하지 않으므로 이 코드는 컴파일 오류가 발생한다

     

     

    그런데 코드 상에서는 null이 될 수도 있지만 실제 동작 중에는 null이 될 소지가 없는 경우가 있다. 아래 코드처럼 전역 변수인데 실행과 동시에 초기화를 시키는 경우가 이렇다. 논리적으로는 안전한 코드임에도 불구하고 값에 접근 할 때 null safe 지시자를 표시해야하는 불편함이 생긴다. 

     

    class TestActivity: Activity() {
        var name: String? = null
        override fun onCreate() {
            name = "abcd"
            print("${name?.length}")
        }
    }

     

    lateinit 

     

    lateinit을 사용하면 변수의 값을 지정하는 작업을 뒤로 미룰 수 있다. Nullable 하지 않은 변수를 선언하면서 Assign 하는 작업을 뒤로 미루고 싶을때는 lateinit 키워드를 사용하면 가능하면 된다. 아래 코드는 name 변수 앞에 lateinit 키워드를 두고 onCreate 콜백에서 값을 바로 지정했다. 선언 당시 Non-Null String으로 선언했기 때문에 호출할 때 

     

    class TestActivity: Activity() {
        lateinit var name: String
        override fun onCreate() {
            name = "abcd"
            print("${name.length}")
        }
    }

     

    lateinit은 mutable 변수만 가능하기 때문에 var 키워드를 가진 변수에서만 사용이 가능하다. 실행 중에 값을 변경할 필요가 있는 경우 유용하다. 그리고 만약 값을 assign하지 않고 변수 값을 호출하는 경우에는 Kotlin 언어 상에서 에러를 발생시킨다.

     

    by lazy 

     

    by lazy 키워드는 lateinit과 비슷하게 값을 지정하는 작업을 미루는 작업인데 assign 되는 시점이 변수를 호출하는 시점이다. 아래 코드를 보면 name 변수 선언에 by lazy 키워드가 붙고 내부 브래킷에 "abcd" 코드가 있다. name변수가 호출되는 시점에 "abcd"로 assign 하겠다는 의미다. 실제 코드를 동작시켜보면 name 호출 시점에 by lazy 내부 로그가 먼저 호출되는 것을 볼 수 있다.

     

    class Test {
        val name : String by lazy {
            println("this is name by lazy")
            "abcd"
        }
    
        init {
            println("I am here")
            println(name)
        }
    }
    
    // 실행 결과
    I am here
    this is name by lazy
    abcd

     

    by lazy는 immutable 변수에서만 적용이 가능해, val 키워드 변수에만 적용이 가능하다. 변수 값을 최초에만 설정하고 변경할 필요가 없는 경우 사용하면 유용하다. 변수 선언시에 값을 assign할 순 없지만 다른 변수들을 조합해 값을 설정하고 싶을 때 사용하면 유용하다.

    '개발 > 안드로이드' 카테고리의 다른 글

    Single, Maybe, Completable  (0) 2021.07.04
    Serializable 과 Parcelable  (0) 2021.06.19
    Kotlin - Coroutine  (0) 2021.05.21
    Android 10 스토리지 정책 대처하기  (2) 2021.05.18
    다음 페이지가 살짝 보이는 ViewPager2 만들기  (0) 2021.05.13

    댓글

Designed by Tistory.