안드로이드 개발자의 창고
[14일차 Kotlin] 지연 초기화 - lateinit과 lazy 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 지연 초기화란?
- Kotlin은 프로퍼티를 선언할 때 값을 무조건 설정해야 하는데 이를 지연 시키는 것을 지연 초기화라고 한다.
lateinit
- var 로 선언된 변수의 초기화를 뒤로 미룰 수 있다.
- 변수의 값을 사용하기 전에 반드시 초기화가 이루어져야 한다.
- val 로 선언된 변수는 오류가 발생한다.
- lateinit은 기본 자료형(Int, Double 등)에서는 사용할 수 없다.
lazy
- val로 선언된 변수는 setter()가 생성되지 않기 때문에 lateinit으로 지연 초기화 하는 것이 불가능하다.
- val로 선언된 변수는 lazy 코드 블록을 이용하면 되는데 이는 나중에 프로퍼티의 값을 셋팅해준다는 의미가 아닌 사용할 때 값을 초기화 한다는 의미를 가지고 있다.
- lazy 코드 블록의 제일 마지막에 작성한 값이나 변수의 값, 수식의 값을 프로퍼티에 저장한다.
📖 예제 코드
fun main(){
val t1 = TestClass1()
t1.testMethod1()
println("---------------------------------------")
t1.a4 = "문자열 입니다."
t1.testMethod1()
}
class TestClass1{
var a1:Int = 100
var a2 = 200
var a3:Int
// lateinit
lateinit var a4:String
// lazy
val a5:Int by lazy {
val temp = 1 + 2 + 3 + 4 + 5
temp
}
init{
a3 = 300
}
fun testMethod1(){
println("a1 : $a1")
println("a2 : $a2")
println("a3 : $a3")
if(::a4.isInitialized){
println("a4 : $a4")
}
println("a5 : $a5")
}
}
✔️ 코드 해석
- a3은 var 프로퍼티이므로 init 블록에서 값을 저장하였다.
- init 블록에서 프로퍼티에 값을 저장한다면 프로퍼티를 정의할 때 값을 저장하지 않아도 된다.
- a4는 val 프로퍼티이므로 lateinit을 사용하여 지연 초기화하였다.
- testMethod1()에서 ::을 사용하여 a4에 대한 속성을 참조한다.
- a4가 초기화가 되어있을 때만 a4의 값을 출력한다.
- 따라서 값을 저장하지 않으면 a4는 출력되지 않는다.
- a5는 lazy를 이용하여 지연 초기화하였다.
- lazy 블럭 내에서 temp가 가장 마지막에 작성되어있기 때문에 temp(1+2+3+4+5) 값이 저장되고 출력된다.
✔️Console 출력 결과
'Computer > Kotlin' 카테고리의 다른 글
[15일차 Kotlin] Any (0) | 2023.05.17 |
---|---|
[14일차 Kotlin] Overriding(오버라이딩) (0) | 2023.05.17 |
[14일차 Kotlin] 캡슐화와 Property(프로퍼티) (0) | 2023.05.17 |
[14일차 Kotlin] 접근제한자 (0) | 2023.05.16 |
[14일차 Kotlin] 패키지(Package)와 모듈(Module) (0) | 2023.05.16 |