본문 바로가기

Android/이론

Kotlin 문법 (1) 변수/함수 선언하기, Nullable/Non-Null

728x90
반응형
SMALL

 

변수


 

var 일반 변수
val 읽기만 가능한 final 변수

 

val 변수는 읽기만 가능하여 오직 한번만 값이 할당될 수 있습니다.

 

val a: Int = 1  // immediate assignment
val b = 2   // `Int` type is inferred
val c: Int  // Type required when no initializer is provided
c = 3       // deferred assignment

 

데이터 타입을 정하지 않고 정의할 수도 있습니다. 데이터 타입이 자동으로 정해집니다.

 

var x = 5 // `Int` type is inferred
x += 1

 

 

Nullable/Non-Null


 

또한 리턴타입이나 변수가 Nullable 인지, Non-Null인지도 구별할 수 있습니다.

위처럼 정의하면 null값을 가질수 없는 Non-Null 타입이 됩니다.

 

var x = 5
x = null //에러

 

따라서 위와 같은 x 변수는 Non-Null 타입으로 null값이 들어가면 에러가 발생합니다.

Nullable로 선언하는 방법은 다음과 같습니다.

 

var name: String? = null

 

위처럼 변수타입 뒤에   를 붙여주어야 합니다.

 

var a: String = "abc" // Regular initialization means non-null by default
a = null // error

var b: String? = "abc" // can be set null
b = null // ok

 

val l1 = a.length // ok
val l2 = b.length // error: variable 'b' can be null

 

l2는 다음과 같이 정의할 수 있습니다.

 

val l2 = if (b != null) b.length else -1

 

b는 nullable하므로 null인지 check하여 정의 할 수 있습니다.

 

  • 위의 코드는 Elvis Operator   ?:  를 사용하여 다음과 같이 쓸 수 있습니다.

 

val l = b?.length ?: -1

 

 ?: 의 왼편은 null이 아닐때 return값, 오른편은 null일때의 리턴값이 됩니다.

 

fun foo(node: Node): String? {
    val parent = node.getParent() ?: return null
    val name = node.getName() ?: throw IllegalArgumentException("name expected")
    // ...
}

 

 

  •  !! 를 사용하면 어느 value던지 non-null 타입으로 변환시키고, value가 null이면 exception을 throw하게 됩니다.

 

val l = b!!.length

 

 

 

  • 또는  ?.     let 을 사용하여 safe call을 할 수 있습니다.

 

val a = "Kotlin"
val b: String? = null
println(b?.length)
println(a?.length) // Unnecessary safe call

 

// If either `person` or `person.department` is null, the function is not called:
person?.department?.head = managersPool.getManager()

 

val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
    item?.let { println(it) } // prints Kotlin and ignores null
}

 

 

 

함수


 

그럼 null값이 가능한 Int형을 return하는 함수를 정의해보겠습니다.

 

fun parseInt(str: String): Int? {
    // ...
    return null
}

 

fun을 사용하여 함수를 정의해주세요. 리턴 값 타입에 ?를 붙여 Nullable한 Int형을 리턴하는 것을 알 수 있습니다.

 

Kotlin은 이처럼 Nullable을 사용해 NullPointerException 에러를 피할 수 있습니다.

 


 

참고 자료

728x90
반응형
LIST