티스토리 뷰

728x90

1. Nullable 자바와의 비교

void setInfo(@NonNull String a, @Nullable String b) {
}

public void test() {
	setInfo(null, null);
 }

자바는 @NonNull (또는 @NotNull) 을 사용할 수 있다.
그러나 런타임시 Exception 에러를 발생하고, 컴파일단에서는 Warning만 줄 뿐이다. 

Kotlin에서는
- 기본적으로 null을 허용하지 않는다. 
- null을 명시적으로 나타내기 위해서는 ? 를 추가해야 한다. 
- java 디컴파일시 Exception이 발생하도록 내부 처리를 하고 있다.
- IDE에서 null을 사용할 수 없음을 즉시 알려준다. 

fun setInfo(a: String, b: String?) {
}

fun test() {
	setInfo(null, null)  // 컴파일 에러!
}

 2. Elvis Operator

자바에서 3항식은 아래와 같다. 

String temp = null;
int size = temp != null ? temp.length() : 0;

- Elvis Operator 는 3항식의 역할을 하는데 , ?: 를 사용한다. 

val temp: String? = null
textView.text = temp ?: ""


Kotlin의 NullPointException

<Null Pointer Exception in Java>
String temp = null;
int size = temp.length(); // Null Pointer Exception!

<Null Pointer Exception in Kotlin>
val temp: String? = null
val size = temp!!.length // Null Pointer Exception!

 

3. 안전한 형 변환

- java
instanceof 를 사용

Object object = "name";
int index = 0;
if (object instanceof Integer) {
	index = (int) object;
}

- kotlin
as 뒤에 ? 를 붙인다

val a: Any? = "ABC"
val b: Int? = a as Int // ClassCastException 발생

val b: Int? = a as? Int // 안전한 형변환

when을 사용한 안전한 처리

val a: Any? = "ABC"
when (a) {
	is Int -> println(a)
	is String -> println(a)
	else -> println("nothing")
}   

4. list에서 null 아이템을 제외하기 

val listWithNulls: List<String?> = listOf("A", null, "B");
for (item in listWithNulls) {
	// 출력
    }
}    

<스트림>
val listWithNulls: List<String?> = listOf("A", null, "B")
listWithNulls.filter { it != null }.forEach {
	println("Text: $it")
}    

<FilterNotNull 도 있다>
val itemList: List<String> = listWithNulls.filterNotNull();

 

5. Kotlin standard - run, let, apply 등을 이용한 null 처리

val sample: Sample? = Sample("Name", 20, "id")

tvName.text = Sample?.name ?: ""
tvAge.text = Sample?.text ?: ""

아래처럼 let을 사용하여 일괄 null 처리가 가능하다. 

sample?.let {
	tvName.text = it.name
    tvAge.text = it.age
} ?: let {
	println("Sample is null!!")
    tvName.visibility = View.Gone
    tvAge.visibility = View.Gone
}    

1개 이상의 null 체크는 어떻게 할까요?

val a: String? = "ABC"
val b: String? = "BBB"

if (a != null && b != null) {
	println("$a $b")
}    

safeLet() 을 사용하면 된다

val a: String? = "ABC"
val b: String? = "BBB"

safeLet(a, b) { a, b ->
	println("$a $b")
}    

safeLet 함수 구조 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함