null
이 들어올 수 있기에 null safe하게 개발하기 위해 자바에선 아래와 같은 방법을 사용할 수 있다.public boolean startsWithA1(String str) { // 예외 발생
if (str == null) throw new IllegalArgumentException("null이 들어왔습니다");
return str.startsWith("A");
}
public Boolean startsWithA2(String str) { // null 반환
if (str == null) {
return null;
}
return str.startsWith("A");
}
public boolean startsWithA3(String str) { // false 반환
if (str == null) {
return false;
}
return str.startsWith("A");
}
null
일 수 있으면 ?
로 표시를 한다.null
일 수 있는 타입과 아닌 타입을 완전 다르게 취급한다.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
체크를 고려할 필요가 없게 된다.fun startsWithA(str: String): Boolean {
return str.startsWith("A")
}
null
이 아니면 실행하고 null
이면 실행하지 않는다. (그대로 null
)val str: String? = "ABC"
str.length // 불가능
str?.length // 가능!!, null 반환
null
이면 뒤의 값을 사용val str: String? = "ABC"
str?.length ?: 0
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
}
null
이 될 수 없는 경우
!!
키워드로 null
처리 없이 바로 함수 등을 호출할 수 있다.null
이 들어오면 NPE가 발생하기에 확실한 경우에만 사용해야 한다.fun startsWit(str: String?): Boolean { // 절대 null이 들어올 수 없지만 nullable type인 경우
return str!!.startsWith("A")
}
null
과 관련된 어노테이션을 활용하면 코틀린이 이를 활용할 수 있다.
javax.annotaion
android.support.annotation
org.jetbrains.annotation
import org.jetbrains.annotations.Nullable;
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
@Nullable
public String getName() {
return name;
}
}
fun main() {
val person = Person("이동규") // 자바 코드 사용
startsWithA(person.name) // 컴파일 에러
}
fun startsWithA(str: String): Boolean { // nullable 타입이 아니기 때문
return str.startsWith("A")
}
null
관련 정보를 알 수 없는 타입
@Nullable
과 같은 null
정보가 없다면 null
이 들어와도 컴파일 에러가 발생하지 않는다.