Kotlin 문법 - lateinit

느린달팽이·2025년 9월 29일

코틀린 복습

목록 보기
21/25

lateinit란?

  • lateinit"나중에 초기화하겠다"(late initialization)는 의미를 가진 키워드입니다.
  • 보통 val(읽기 전용)에는 사용할 수 없고, var(가변 변수)Non-null 타입에만 적용됩니다.
  • 즉, 선언 시 값을 할당하지 않고, 나중에 꼭 초기화할 것을 보장할 때 사용합니다.

📌 사용 조건

  1. var 이어야 함 (val에는 사용 불가)
  2. Non-null 타입이어야 함 (String? 같은 Nullable에는 불가)
  3. 기본 타입(Int, Double 등) 에는 사용 불가 → 객체 타입만 가능

기본 예시

class User {
    lateinit var name: String   // 나중에 반드시 초기화할 변수

    fun initName(newName: String) {
        name = newName
    }

    fun printName() {
        println("사용자 이름: $name")
    }
}

val u = User()
u.initName("민수")   // 나중에 초기화
u.printName()        // 출력: 사용자 이름: 민수

선언 시 값이 없어도 컴파일 오류가 발생하지 않고, 나중에 initName()에서 반드시 초기화함.


자주 쓰이는 상황

1) DI (의존성 주입)

class Service

class Client {
    lateinit var service: Service   // 외부에서 주입 예정
}

→ 스프링(Spring) 같은 프레임워크에서 객체 주입 시점에 활용.


2) Android 개발 (View, Context 등)

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 체크 없이 선언 가능.


⚠️ 주의사항

  1. 초기화 전에 사용하면 UninitializedPropertyAccessException 발생

    lateinit var title: String
    println(title) // ❌ 초기화 안 해서 런타임 오류
  2. 기본 타입에는 사용할 수 없음

    lateinit var age: Int // ❌ 컴파일 오류

    → 해결: Int?(nullable) 또는 Delegates.notNull() 활용

    var age: Int by Delegates.notNull()
  3. 꼭 "반드시 나중에 초기화된다"는 논리적 보장이 필요


정리

  • lateinit = 나중에 초기화하는 Non-null var
  • 주로 DI, Android View 바인딩, 테스트 코드 등에서 많이 사용
  • 초기화 전 접근 시 런타임 오류가 나므로, 확실히 초기화 시점을 보장할 때만 사용해야 함
profile
한걸음이라도 제대로... 쓰임있는 앱을 만들자

0개의 댓글