경험의 기록

 

코틀린에서는 null을 허용하거나 초기화 해주는 방식으로 변수 선언시 무조건 초기화 해주어야하는데,

lateinit을 사용함으로써 초기화를 미룰 수 있다.

하지만 몇가지 제약이 존재한다.

fun main(args:Array<String>){
    lateinit var a : String // 오류 X
    
    lateinit val b : String // val로 선언 불가능하다. (수정해야 하기 때문에)
    lateinit var c : String? // null 허용 타입에는 사용할 수 없다.
    lateinit var d : Int // 기초 타입(Int) 에는 사용 할 수 없다.

}

또한 초기화되지 않은 변수를 참조하면 오류가 발생하므로

class MainActivity : AppCompatActivity() {
    private lateinit var name : String

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if(::name.isInitialized){
        // 초기화 되었을때만 출력
            println("저는 $name 입니다.")
        }
    }
}

isInitialized를 사용하여 초기화 되었는지 확인 할 수 있다.

 

또한 lazy를 사용할 수도 있다.

fun main(){
    
    val a : String by lazy{
        println("초기화 되었습니다.")
        "초기화 상태"
    }
    println("1 : $a")
    println("2 : $a")
    println("3 : $a")
    
    var b : String by lazy{
        "b"
    } // 오류 => var로 선언 불가능
}

by lazy의 형태로 사용하며, 초기화를 호출 시점으로 미뤄준다.

block은 처음 호출시에만 초기화되며, 그이후론 람다식으로 결과를 가져오기만 한다.

lazy는 var의 형태로 선언될 수 없다.

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading