PHpullh
학습 라이브러리/Kotlin/지연 초기화 패턴 (Late Init)

KOTLIN · 객체지향

지연 초기화 패턴 (Late Init)

lateinit으로 non-null 프로퍼티의 초기화를 지연합니다. DI 프레임워크나 테스트에서 자주 사용됩니다.

객체지향중급lateinitlazy-initisInitializeddependency-injection

핵심 설명

lateinit으로 non-null 프로퍼티의 초기화를 지연합니다. DI 프레임워크나 테스트에서 자주 사용됩니다.

Kotlin code

class DatabaseConnection {
    lateinit var connectionString: String
    lateinit var driver: String

    fun isInitialized() = ::connectionString.isInitialized

    fun connect() {
        if (!::connectionString.isInitialized) {
            throw IllegalStateException("연결 문자열이 설정되지 않았습니다")
        }
        println("연결: $connectionString (드라이버: $driver)")
    }
}

// 테스트에서의 활용
class UserServiceTest {
    lateinit var service: String  // @BeforeEach에서 초기화

    fun setUp() {
        service = "UserService-Mock"
    }

    fun testCreate() {
        setUp()
        println("테스트: $service")
    }
}

fun main() {
    val db = DatabaseConnection()
    println("초기화됨? ${db.isInitialized()}")  // false

    db.connectionString = "jdbc:mysql://localhost/test"
    db.driver = "mysql"
    println("초기화됨? ${db.isInitialized()}")  // true
    db.connect()
}

학습 팁

::property.isInitialized로 초기화 여부를 안전하게 확인한 후 접근하면 UninitializedPropertyAccessException을 방지합니다.

주의할 점

lateinitvar에만, 기본형이 아닌 타입에만 사용 가능합니다. Int, Boolean 등 기본형에는 사용할 수 없습니다.

자주 묻는 질문

지연 초기화 패턴 (Late Init)란 무엇인가요?

lateinit 으로 non-null 프로퍼티의 초기화를 지연합니다. DI 프레임워크나 테스트에서 자주 사용됩니다.

지연 초기화 패턴 (Late Init) 학습 시 주의할 점은 무엇인가요?

lateinit 은 var 에만, 기본형이 아닌 타입에만 사용 가능합니다. Int , Boolean 등 기본형에는 사용할 수 없습니다.