(Kotlin) null을 컨트롤 하는 연산자

|

?. - 안전한 호출 (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