[Kotlin] lateinit과 by lazy

박상군·2022년 6월 16일
0

Kotlin

목록 보기
4/9
post-thumbnail

늦은 초기화 너 뭔데?

자바로 개발을 하다보면 많이 볼 수 있는 에러인 NPE(Null Pointer Exception)
NPE가 발생하면 벌써부터 머리가 어질어질 합니다.
그래서 코틀린에선 NullPointerExeption을 코드상에서 제거하기 위해 Null Safety를 지원합니다.

Null Safety란 개발자가 코딩중에 실수하지 않도록 타입 시스템이 Null이 가능한지 아닌지 변수 선언시 타입뒤에 ?를 붙혀 Null을 허용하도록 해주는 기능입니다.

그런데 코드 상에서는 null이 될 수도 있지만 실제 동작 중에는 null이 될 소지가 없는 경우가 있습니다.

예를 들어

class MainActivity: AppCompatActivity() {
    var testString: String? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        testString = "테스트"
    }
}

위와 같이 testString를 전역변수로 선언 후 onCreate()에서 초기화를 시켜주는 코드입니다. 이때 onCreate()에서 값이 항상 초기화되기 때문에 안전한 코드라고 볼 수 있습니다. 그러나 이때도 ?를 표시해야 하는 불편함이 있습니다.

이때 사용하는 키워드가 lateinit과 by lazy입니다. 둘은 비슷하면서 다른 점이 있습니다.


1. lateinit

class MainActivity: AppCompatActivity() {
    lateinit var testString: String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        testString = "테스트"
        println(testString)
    }
}

위와 같이 변수 앞에lateinit 키워드를 붙히고 변수의 자료형을 명시해줍니다.
lateinit은 mutable변수에만 사용이 가능하기 때문에 var 타입의 변수에만 사용이 가능합니다.
실행 중 값을 변경할 필요가 있는 경우에 유용합니다.

2. by lazy

class MainActivity: AppCompatActivity() {
    val testString: String by lazy {
        "테스트"
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        println(testString)
    }
}

by lazy는 해당 변수가 호출되는 시점에 초기화를 하겠다는 의미입니다.
by lazylateinit 과 다르게 immutable변수에만 사용이 가능하기 때문에 val 타입의 변수에만 사용이 가능합니다.


마무리

자바를 사용하다 코틀린으로 넘어가신 분들은 공감하시겠지만 코틀린 한번 쓰면 다시 자바로 넘어가고 싶지가 않네요..

Reference

kotlin lateinit, lazy by

0개의 댓글