Kotlin

[android : kotlin] 코틀린 물음표 null 처리 방법 ?: , !! , as?사용 예제(엘비스 연산자) null 처리 방법에 대한 처리

코틀린은 기본적으로 값이 null이 아니다. 기본적으로 NotNull이다.  Nullable 표현에만 ‘?’가 사용된다.

아래 코드 스니펫에 대한 코드를 실행해 보면 temp 변수가 null임으로 오류가 발생하고 어떻게 처리해야하는지 알려준다.

fun main() {
    var temp: String? = null
	println("### temp length:  ${temp.length}")
}

[실행결과] 세이프 콜 또는 non-null를 assert할 수 있다.


■ null 처리 방법에 대해 알아보자

첫번째로 세이프콜(Safe-call)에 대한 예제를 알아본다.

물음표를 사용하여 temp?.length 를 호출해보자. null이 아닌경우에만 .length가 실행됨으로 null값을 리턴한다.

fun main() {
    var temp: String? = null
	println("### temp length:  ${temp?.length}")
}

[실행결과]

### temp length:  null

두번째로 non-null 단정 기호를 활용한 처리 예제를 알아본다.

fun main() {
    var temp: String? = null
	println("### temp length:  ${temp!!.length}")
}

null값을 가질 수 없음으로 NullPointerException오류가 발생된다.

[실행결과]


세번째 방법으로 if와 else문을 사용하여 처리하는 방법이다.

fun main() {
    var temp: String? = null 
    var tempLen: Int = 0
    
    tempLen = if(temp!= null) temp.length else -1
 	println("### temp length:  ${tempLen}")
    
}

[실행결과]

### temp length:  -1

네번째 방법으로 엘비스 연산자(?:)를 사용하는 방법이다. 세이프 콜과 함께 사용하면 더 안전하게 사용할 수 있다.

fun main() {
    var temp: String? = null 
    var tempLen: Int = 0
    
    tempLen = temp?.length?: -1
 	println("### temp length:  ${tempLen}")
    
}

[실행결과]

### temp length:  -1

duration.toLongOrNull() ?: 0

duration값이 null이면 0을 리턴한다는 의미이다. null이 아니면 문자열 값을 Long 타입으로 형변환하여 리턴한다.

fun getMediaDuration(context: Context, uri: Uri): Long {

	var metaRetriever:MediaMetadataRetriever = MediaMetadataRetriever()

	return try { 
    
		metaRetriever.setDataSource(context, uri)
		val duration: String =
			metaRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
  
		metaRetriever.release()
		duration.toLongOrNull() ?: 0
	} catch (exception: Exception) {
		0
	}
}

데이터 타입에 대한 형변환을 할때 안전하게 처리하는 방법이 있다. 바로 as?연산자사용하는 것이다.

아래 코드 처럼  문자열을 Int 타입으로 형변환 하려고 하면 CastExcaption 오류가 발생된다.

fun main() {
    var temp: String? = null 
    
    temp ="You can edit, run, and share this code."
   
 	var value: Int = temp as Int
    
}

[실행결과]


[안전하게 형변환 하는 예제 코드] 엘비스 연산자와 함께 as?연산자를 사용하였다.

fun main() {
    var temp: String? = null 
    
    temp ="You can edit, run, and share this code."
   
 	var value: Int = temp as? Int ?: 0
   
}

기본에 충실하자!! 기록하지 않으니, 자주 사용하지 않으니 까먹게 된다. 이렇게 사용하다가 자바로 개발하면 또 햇갈리겠지…….또 기억나지 않을테고…… 기록만이 살길이다.

[REFERENCE}

kotlinlang.org/docs/reference/null-safety.html#nullable-types-and-non-null-types

kotlinlang.org/docs/reference/null-safety.html#safe-calls

kotlinlang.org/docs/reference/null-safety.html#elvis-operator

kotlinlang.org/docs/reference/null-safety.html#the–operator

kotlinlang.org/docs/reference/keyword-reference.html#keywords-and-operators

kotlinlang.org/docs/reference/typecasts.html#unsafe-cast-operator

Leave a Reply

error: Content is protected !!