티스토리 뷰

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

 

Kotlin in Action - YES24

코틀린이 안드로이드 공식 언어가 되면서 관심이 커졌다. 이 책은 코틀린 언어를 개발한 젯브레인의 코틀린 컴파일러 개발자들이 직접 쓴 일종의 공식 서적이라 할 수 있다. 코틀린 언어의 가장

www.yes24.com

 

'Kotlin' 카테고리의 다른 글

[Kotlin] 지연 계산(Lazy) 컬렉션 연산  (0) 2022.03.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함