Kotlin
[Kotlin] null 처리 방법 정리
DevHyo
2022. 3. 6. 17:40
Kotlin 언어는 nullable 특성을 가지고 있다. 즉, null 값을 허용하며, 타입도 존재한다. 따라서 null이 될 수 있는 타입을 다룰 때 처리하는 방법을 정리하려고 한다.
?. (안전한 호출 연산자)
- 호출하려는 값이 null이 아니면, 일반 메서드 호출처럼 작동한다. 만약에 null 인 경우, null 값을 반환한다.
fun safetyCallOperation(text: String?) {
val result: String? = text?.toUpperCase()
// 결과는???
}
위와 같은 코드가 있을 때, text 값이 null이 아니면, toUpperCase() 메서드를 호출하고, null인 경우 그대로 null 값을 반환한다. 따라서 result 변수의 타입은 String?이다.
?: (엘비스 연산자)
- null 대신 사용할 디폴트 값을 지정할 때, 사용할 수 있는 연산자이다.
- Kotlin에서는 return이나 throw 등의 연산도 식이기 때문에 엘비스 연산자 우항에 return 또는 throw 등의 연산을 넣을 수 있다.
fun elvisOperation(text: String?): String {
val result: String = text ?: "default value!!"
}
text 값이 null이 아닌 경우, 그대로 text 값을 사용하고, null인 경우에는 "default value!!"라는 값을 반환한다.
fun elvisOperation(text: String?): String {
return text ?: throw IlleagalArgumentException("text값이 유효하지 않습니다.")
}
위에 설명한 것처럼 엘비스 연산자 우항에 throw 식을 지정할 수도 있다.
as? (안전한 캐스트)
- as? 연산자는 어떤 값을 지정한 타입으로 캐스트 한다.
- as? 연산자는 값을 대상 타입으로 변환할 수 없으면, null을 반환한다.
"test" as? String
// 처리 방식
"test" is String // "test" 값이 String 타입이다.
"test" !is String // "test" 값이 String 타입이 아니다.
"test" 값이 String 타입인 경우, "test" is String으로 처리되고, "test" 값이 만약에 String 타입이 아닌 경우, null 값을 반환한다.
!! (널 아님 단언)
- 어떤 값이든 null이 될 수 없는 타입으로 바꿀 수 있다. 그런데 적용하게 되면, NPE가 발생하게 된다.
- !! 연산자는 컴파일러에게 해당 값이 null 값이 아님을 알고 있으며, NPE가 발생해도 감수하겠다는 의미이다.
fun ignoreNulls(text: String?) {
val result: String = text!!
}
let 함수
- let 함수를 사용하면, 원하는 식을 평가해서 결과가 null인지 검사한 다음에 그 결과를 변수에 넣는 간단한 식을 한 번에 처리할 수 있다.
- null이 될 수 없는 타입을 인자로 받는 람다 함수이다.
fun printFirstWord(text: String) {
println("firstWord is ${text.first()}")
}
val text: String? = "Kotlin"
text?.let { printFirstWord(text = it) }
// 결과
// firstWord is K
위의 코드와 같이 작성할 수 있으면, 동작 방식은 다음과 같다.
lateinit (지연 초기화)
- 어떠한 프로퍼티를 바로 초기화하지 않고, 내가 원하는 시점에 초기화할 수 있는 변경자 키워드이다.
- 지연 초기화를 사용하는 경우, 항상 var로 선언되어야 한다.
- lateinit 변경자는 의존관계 주입(ID) 프레임워크와 함께 사용하는 경우가 많다.
internal class Tests : DescribeSpec() {
private lateinit var myService: MyService
init {
beforeSpec {
myService = MyService()
}
describe("~인 경우") {
it("~를 테스트 한다.") {
}
}
}
}
참고
- http://www.yes24.com/Product/Goods/55148593