상상하라 그리고 현실로 만들어라.

상상하는 모든 것이 미래다.

Kotlin과 Android/Kotlin

코틀린 변수 늦은 초기화

월터제이(Walter J) 2020. 10. 20. 09:00

안녕하세요, 반갑습니다!

 

아시다시피 코틀린은 변수 또는 상수의 값으로 null을 허용하지 않습니다.

최초 무조건 null이 아닌 값으로 초기화를 해야합니다.

(물음표( ? ) 연산자를 사용해서 null 로 초기화할 수 있습니다.)

 

"아니, 난 일단 선언하고 나중에 나중에 초기화 하고 싶은데?"

 

네, 가끔 그러고 싶을 때가 있지요.

경우에 따라 나중에 초기화 해야하는 경우도 있고요.

 

그럴 때를 위한 코틀린의 

 

 

늦은 초기화

(lateinit / lazy)

 

 

 

코틀린은 변수(var) 과 상수(val) 에 각각 늦은 초기화 방법을 제공합니다.

 

1. 변수(var)의 늦은 초기화

키워드는 'lateinit' 입니다.

class MainActivity : AppCompatActivity() {
    private lateinit var textView:TextView	//lateinit 을 사용해서 초기화 없이 선언

    override fun onCreate(savedInstanceState: Bundle?) {
	.
    	.
	.
        textView = findViewById(R.id.testTxt) //초기화
    }
}

 

코틀린으로 와서는 저렇게 findViewById() 를 쓸 것 없이 바로 layout.xml의 id 를 가져올 수 있긴한데요.

 

하지만 그 외에도 전역변수를 사용할 일이 여럿 발생하곤 합니다.

그래서 lateinit 이 유용합니다.

 

하지만 조건이 좀 까다로운 편인데요.

 

1. 변수(var) 에만 사용할 수 있습니다.

2. null 값으로 초기화는 안됩니다.

3. 초기화되기 전까지는 lateinit 으로 선언된 변수는 사용할 수 없습니다.

4. 기본 자료형, Int Long, Double, Float 에는 사용할 수 없습니다.

 

 

2. 상수(val) 의 늦은 초기화 방법

키워드는 'lazy' 입니다.

class MainActivity : AppCompatActivity() {
    private val PIE:Double by lazy {
        println("초기화")
        3.141592
    }
    override fun onCreate(savedInstanceState: Bundle?) {
    	.
	.
    	.
        println(PIE)
        println(PIE)
    }
}

 

상수 PIE가 처음 호출될 때 lazy 블록의 코드가 실행됩니다.

그리고 위 코드와 같이 두 번 호출하면 결과 화면처럼 첫 호출에만 println("초기화") 가 실행됨을 볼 수 있습니다.

두 번째 호출부터는 PIE의 값이 출력되죠.

 

상수의 늦은 초기화(lazy)는 앱이 시작될 때 연산을 분산시킬 수 있어서 조금 더 빠른 실행을 할 수 있다는 장점이 있습니다.

 

하지만 역시 조건이 있는데요.

 

1. 상수(val) 에서만 사용 가능합니다.

 

다행히 1개밖에 없습니다. 조금 더 편하게 사용할 수 있겠죠?

근데 생각보다 lazy는 그렇게 쓸 일이...ㅎ

 

 

 

자바를 하다가 코틀린을 하려니 새로 생긴 것들이 많음을 느낍니다.

그래서 공부해야할 것도 점점 많아지는 거..ㅅ.....ㅠ

 

그래도 좀 더 직관적이고 단순해져서 그럴까요? 자바보다 점점 더 편해짐을 느끼네요

오늘도 감사합니다!

반응형