Kotlin의 null 다루기
Kotlin에서 null 체크
Java 코드
1
2
3
public boolean startsWithA(String str) {
return str.startsWith("A");
}
위 코드는 안전한 코드 일까??
- 아니다!!
만약 null이 들어오면 NullPointException (NPE)
이 발생한다.
3가지 경우로 개선 가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public boolean startsWithA1(String str) {
if (str == null) {
throw new IllegalArgumentException("null이 들어왔습니다");
}
return str.startsWith("A");
}
public Boolean startsWithA2(String str) {
if (str == null) {
return null;
}
return str.startsWith("A");
}
public boolean startsWithA3(String str) {
if (str == null) {
return false;
}
return str.startsWith("A");
}
Kotlin 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fun startsWithA1(str: String?): Boolean {
if (str == null) {
throw IllegalArgumentException("null이 들어왔습니다")
}
return str.startsWith("A")
}
fun startsWithA2(str: String?): Boolean? {
if(str == null){
return null
}
return str.startsWith("A")
}
fun startsWithA3(str: String?): Boolean {
if(str == null){
return false
}
return str.startsWith("A")
}
null을 허용하지 않도록 작성할 수 있다.
1
2
3
fun startsWithA(str: String): Boolean {
return str.startsWith("A")
}
Safe Call과 Elvis 연산자
- Kotlin에서는 null이 가능한 타입은 완전히 다르게 취급
- null이 가능한 타입만을 위한 기능 :
Safe Call
,Elvis
Safe Call
예제
1
2
3
4
val str: String? = "ABC"
str.length // 불가능
str?.length // 가능
- null이 아니면 실행
- null이면 미실행 (그대로 null)
Elvis
예제
1
2
val str: String? = "ABC"
str?.length ?: 0
Safe Call과 Elvis를 사용해 수정한 예제
1
2
3
4
5
6
7
8
9
10
11
12
13
fun startsWithA1(str: String?): Boolean {
return str?.startsWith("A") ?: throw IllegalArgumentException("null이 들어왔습니다")
}
fun startsWithA2(str: String?): Boolean? {
return str?.startsWith("A")
}
fun startsWithA3(str: String?): Boolean {
return str?.startsWith("A") ?: false
}
널 아님 단언
- nullable type이지만, null이 될 수 없는 경우
- 예를 들어 처음 생성되는 경우에는 null일 수 있지만 값이 한번 들어오면 null이 될 수 없는 경우 등…
1
2
3
fun startsWith(str: String?): Boolean {
return str!!.startsWith("A")
}
절대 null이 아니라는 의미로 !!
를 붙여서 사용
플랫폼 타입
- Kotlin에서 Java를 가져와 사용 가능
- Java코드에 @Nullable이 없거나 null 관련 정보를 알 수 없는 타입
Runtime 시 Exception이 발생
할 수 있음
예제 Person
1
2
3
4
5
6
7
8
9
10
11
12
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Kotlin에서 사용
1
2
3
4
5
6
7
8
9
10
fun main(){
val person = Person("개발자");
startsWithNotNull(person.name)
}
fun startsWithNotNull(str: String): Boolean{
return str.startsWith("A")
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.