PersesTitan(페르) 기술블로그

[Kotlin] 코틀린 기초 - 변수 정의 (var, val, lateinit) 본문

Language/Kotlin

[Kotlin] 코틀린 기초 - 변수 정의 (var, val, lateinit)

PersesTitan(페르) 2023. 10. 11. 09:47

변수 정의

코틀린은 타입추론기능을 지원하기 때문에 바로 변수를 정의할때 타입입력이 필수가 되지는 않습니다.

java10에서도 var키워드를 이용하여 타입추론이 가능했지만 일부 제약이 존재하였지만 Kotlin에서는 값을 변수에 바로 초기화 해줄경우 타입 입력이 필수가 되지는 않습니다.

var

값이 고정되지 않은 변수를 선언할때 사용하는 키워드입니다.

계속하여 값이 변경이 일어날때 해당 키워드를 이용하여 정의하면 됩니다.

var value: Int = 1
value = 2

Java에서

Java10에서 부터 var키워드가 존재하지만 Kotlin에서의 var과 Java에서의 var는 서로 다른 기능입니다.

val

값이 고정된 변수를 선언할때 사용하는 키워드입니다.

해당 값을 변경할려고 시도하면 에러가 발생하게 됩니다.

val value: Int = 1
value = 2 // error - Kotlin: Val cannot be reassigned

 

 

Java에서

해당 키워드는 Java에서는 final키워드와 동일한 역할이라고 볼 수 있습니다.

 

lateinit

변수를 나중에 초기화 해야할때 유용하게 사용할 수 있는 키워드 입니다.

해당 키워드를 이용하지 않는다면 Kotlin에서는 값을 잠시 비워두기 힘들기 때문에 작업이 번거러워질 수 있지만 해당 키워드를 이용한다면 해당 문제를 해결이 가능합니다.

 

해당 키워드 같은경우 나중에 값을 초기화해야할때 자주사용하게 됩니다.

초기화할 값이 반환이 늦게 발생하거나 복잡한 계산후 값을 얻을때 사용할 수 있습니다.

 

나중에 초기화를 하는 작업이기 때문에 값을 변경하는 var로 변수를 정의하게 됩니다. 앞에 lateinit를 작성하면 습관적으로 var를 붙치면 좋습니다.

 

- lateinit를 사용하지 않았을 경우 예시

만약 lateinit를 사용하지 않는다면 다음과 같이 나중에 초기화하기 위해 null를 임시로 넣어서 해결이 가능하지만 나중에 null체크를 계속해주어야하는 번거로움이 존재하게 됩니다.

private var value: String? = null
fun main() {
    // (...)
    value = "Hello World"
    val length: Int = value!!.length
    // (...)
}

 

- lateinit으로 코드를 작성했을때 예시

lateinit을 사용한다면 다음과 같이 깔끔한 코드 작성이 가능해집니다.

private lateinit var value: String
fun main() {
    // (...)
    value = "Hello World"
    val length: Int = value.length
    // (...)
}

 

- 초기화하지 않고 사용했을때 예제

초기화하지 않고 사용했을 경우 다음과 같은 에러가 발생하게 됩니다.

private lateinit var value: String
fun main() {
    // (...)
    value.length
}
Exception in thread "main" kotlin.UninitializedPropertyAccessException: lateinit property value has not been initialized

 

Java에서

자바에서는 값을 임시로 비워두는 것이 가능하기 때문에 이러한 문제를 고민할 필요는 존재하지 않습니다.

private String value;
    
public Test() {
    value = "Hello World";
}