(Kotlin) null을 컨트롤 하는 연산자
05 Feb 2023 | kotlin?. - 안전한 호출 (Safe calls)
- null이 아닌 경우 실행한다.
- let과 연계 사용시 더 간결하게 처리 가능
// JAVA
public String safetyUpperCase(String str) {
if (str != null) {
return str.toUpperCase();
}
}
// kotlin
fun safetyUpperCase(str:String?) = str?.uppercase()
// str이 null일 경우 let 이하 구문은 실행되지 않는다
fun combinePrefixIfNotNull(str:String?, prefix:String) = str?.let { prefix + str }
val s1:String? = null
val s2:String? = "A"
combinePrefixIfNotNull(s1, "PREFIX-") // null
combinePrefixIfNotNull(s2, "PREFIX-") // PREFIX-A
?: - 엘비스연산자 (Elvis operator)
- null 대신 사용 할 디폴트 값을 지정
// JAVA
String value = str == null ? "DEFAULT" : str;
// kotlin
val value = str?: "DEFAULT"
as? - 안전한 캐스트 (Safe casts)
- 지정한 타입으로 캐스트 하고 불가 시 null 반환
// JAVA
public Long toLong(Object obj) {
if (obj instanceof Long) {
return (Long)obj
} else {
return null;
}
}
// kotlin
fun toLong(obj:Any):Long? = obj as? Long
!! - 널 아님 단언 (not-null assertion)
- null이 될 수 있는 타입을 null이 될 수 없는 타입으로 강제전환
- 실제 값이 null일 경우 NPE 발생
- 안티패턴 : person.company!!.address!!.country ** 어느 값에서 NPE가 발생했는지 알기 어렵다
fun <T> notNullAssert(nullable:T?):T = nullable!!
val s1:String? = "NOT-NULL"
val s2:String? = null
notNullAssert(s1)
notNullAssert(s2) // NullPointerException
Comments