안녕하세요, 반갑습니다!
아시다시피 코틀린은 변수 또는 상수의 값으로 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는 그렇게 쓸 일이...ㅎ
자바를 하다가 코틀린을 하려니 새로 생긴 것들이 많음을 느낍니다.
그래서 공부해야할 것도 점점 많아지는 거..ㅅ.....ㅠ
그래도 좀 더 직관적이고 단순해져서 그럴까요? 자바보다 점점 더 편해짐을 느끼네요
오늘도 감사합니다!