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
'Android > 이론' 카테고리의 다른 글
[Android Test] Espresso @SmallTest, @MediumTest, @LargeTest 구분의 의미 (0) | 2020.08.18 |
---|---|
Kotlin 문법 (2) 데이터 클래스(Data class) 사용하기 (0) | 2020.07.17 |
Kotlin 시작하기 ― 설정, Basic 문법 (0) | 2020.07.01 |
[안드로이드] Fragment 생명주기 ― Activity 생명주기와의 관계 (1) | 2020.03.04 |