1. 코틀린에서의 null 체크

    자바 코드를 코틀린으로 변환하면서 이해해보겠다

    1. 반환형 boolean
    public boolean startsWithA1(String str)
    {
    	if(str==null) throw Exception();
    	return str.startsWith("A");
    }
    
    fun startsWithA1(str: String?) : Boolean // String 자료형의 str이라는 변수로 null이 들어올 수 있음을 명시
    // 반환형은 Boolean
    {
    	if(str==null) throw Exception()
    	return str.startsWith("A")
    }
    
    1. 반환형 Boolean
    public Boolean startsWithA1(String str)
    {
    	if(str==null) return null;
    	return str.startsWith("A");
    }
    
    fun startsWithA1(str: String?) : Boolean? // 반환형은 Boolean에 ?추가
    {
    	if(str==null) return null
    	return str.startsWith("A")
    }
    
    1. null체크를 안하는 경우
    fun startsWithA1(str: String?) : Boolean? // 반환형은 Boolean에 ?추가
    {
    	str.startsWith("A") // 컴파일 에러(빨간줄)가 난다.
    	
    	// null이 가능한 str의 함수를 호출할 수 없게 막힌다.
    	// 위에서 if 로 null 체크를 하는 것을 추가하면 변수명이 초록색으로 바뀌는데,
    	// 코틀린은 null은 더이상 아니겠거니 하고 컴파일러가 추측해줘서 그렇다.
    }
    
    fun startsWithA(str : String): Boolean
    {
    	return str.startsWith("A") // str은 null이 들어올 수 없기에 빨간줄이 안생긴다.
    }
    

    결론! 코틀린에서는 null이 가능한 타입을 완전히 다르게 취급한다!

    null이 가능한 타입만을 위한 기능은 없나? 있다!

  2. Safe Call과 Elvis 연산자

safe call ⇒ ?.

val str: String? = "ABC"
str.length // 불가능
str?.length // 가능!!

앞에 오는 변수가 null이 아니면 뒤에 오는 함수나 프로퍼티 등을 실행하고

아니면 전체 값이 null이 된다.

val str1: String? = null
println(str?.length)

=====
null

Elvis 연산자 ⇒ ?:

val str: String? = "ABC"
str?.length ?: 0

앞의 연산 결과가 null이면 뒤의 값을 사용

val str1: String? = "ABC"
println(str1?.length ?: 0)

val str2: String? = null
println(str2?.length ?: 0)

===
ABC
0

Elvis 라고 부르는 이유는… ?: 를 90도 회전하면 생긴 모양이 Elvis라는 가수의 헤어스타일과 닮았다고 해서란다.

여기까지 이해했으면 java를 kotlin으로 좀더 예쁘게 바꿔보자.

public boolean startsWithA1(String str)
{
	if(str==null) throw Exception();
	return str.startsWith("A");
}
fun startsWithA1(str: String?): Boolean
{
	return str?.startsWith("A") ?: throw Exception()
}