lateinit란?lateinit은 "나중에 초기화하겠다"(late initialization)는 의미를 가진 키워드입니다.val(읽기 전용)에는 사용할 수 없고, var(가변 변수) 와 Non-null 타입에만 적용됩니다.var 이어야 함 (val에는 사용 불가)String? 같은 Nullable에는 불가)class User {
lateinit var name: String // 나중에 반드시 초기화할 변수
fun initName(newName: String) {
name = newName
}
fun printName() {
println("사용자 이름: $name")
}
}
val u = User()
u.initName("민수") // 나중에 초기화
u.printName() // 출력: 사용자 이름: 민수
선언 시 값이 없어도 컴파일 오류가 발생하지 않고, 나중에 initName()에서 반드시 초기화함.
class Service
class Client {
lateinit var service: Service // 외부에서 주입 예정
}
→ 스프링(Spring) 같은 프레임워크에서 객체 주입 시점에 활용.
class MainActivity : AppCompatActivity() {
lateinit var textView: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
textView = findViewById(R.id.myTextView)
textView.text = "Hello World!"
}
}
→ onCreate() 시점에서 초기화되므로, lateinit을 사용해 미리 null 체크 없이 선언 가능.
초기화 전에 사용하면 UninitializedPropertyAccessException 발생
lateinit var title: String
println(title) // ❌ 초기화 안 해서 런타임 오류
기본 타입에는 사용할 수 없음
lateinit var age: Int // ❌ 컴파일 오류
→ 해결: Int?(nullable) 또는 Delegates.notNull() 활용
var age: Int by Delegates.notNull()
꼭 "반드시 나중에 초기화된다"는 논리적 보장이 필요
lateinit = 나중에 초기화하는 Non-null var