public boolean startsWithA(String str) {
// "A"로 시작하면 true, 아니면 false 반환
return str.startWithA("A");
}
위 소스는 str
이 null이 들어갈 수 있으므로 안전하지 않다.
public boolean startsWithA1(String str) {
if (null == str) {
throw new IllegalArgumentException("str is null")
}
return str.startsWith("A");
}
fun startsWithA1(str: String?): Boolean {
if (null == str) {
throw IllegalArgumentException("str is null")
}
return str.startsWith("A")
}
public boolean startsWithA2(String str) {
if (null == str) {
return null;
}
return str.startsWith("A");
}
fun startsWithA2(str: String?): Boolean? {
if (null == str) {
return null
}
return str.startsWith("A")
}
fun startsWithA(str: String?) Boolean?
처럼 return type 에 ?
을 붙여주면 return null
가능하다.
public boolean startsWithA3(String str) {
if (null == str) {
return false;
}
return str.startsWith("A");
}
fun startsWithA3(str: String?): Boolean {
if (null == str) {
return false
}
return str.startsWith("A")
}
null이면 그대로 null 반환, null이 아니면 실행
val str1: String? = "ABC"
str.length // 불가능
str?.length // return 3
val str2: String? = null
str.length // 불가능
str?.length // return null
null이 아니면 실행, null이면 ?:
뒤에 값 return
val str1: String? = null
str?.length ?: 10 // return 10
fun startsWithA1(str: String?): Boolean {
return str.startsWith("A") ?: throw IllegalArgumentException("str is null")
}
fun startsWithA2(str: String?): Boolean {
return str?.startsWith("A")
}
fun startsWithA3(str: String?): Boolean {
return str?.startsWith("A") ?: false
}
fun calculate(number: Long?): Long {
number ?: return 0
}
fun calculate(number: Long?): Long {
number ?: return 0
}
nullable type이지만, 아무리 생각해도 null이 될 수 없는 경우 호출 시!!
을 붙인다.
parameter로 null이 들어올시 NullPointerException
이 발생한다.
fun startsWith(str: String?): Boolean {
return str!!.startsWith("A")
}
null이 들어갈 수 있는 Type은 완전히 다르게 간주된다.
null이 아닌 경우에만 호출되는 Safe Call(e. g. str?.length)이 있다.
null인 경우에만 호출되는 Elvis 연산자(e. g. str?.length ?: 0)이 있다.