1) str이 null일 경우 Exception을 낸다.
public boolean startsWithA1(String str) {
	if(str == null) {
		throw new IllegalArgumentException("null이 들어왔습니다");
	}
	return str.startsWith("A");
}

2) str이 null일 경우 null을 반환
public Boolean startsWithA2(String str) {
	if(str == null) {
		return null;
	}
	return str.startsWith("A");
}

3) str이 null일 경우 false을 반환
public boolean startsWithA4(String str) {
	if(str == null) {
		return false;
	}
	return str.startsWith("A");
}

fun main() {
	val str: String? = null
	println(str?.length)
}

fun startsWithA1(str: String?): Boolean {
	//Elvis 연산자 사용 O
	return str?.startsWith("A") 
		?: throw IlleIllegalArgumentException("null이 들어왔습니다")

	//Elvis 연산자 사용 X
	if(str == null) {
		throw IllegalArgumentException("null이 들어왔습니다")
	}
	return str.startsWith("A")
}

fun startsWithA2(str: String?): Boolean? {
	return str?.startsWith("A")

	if(str == null) {
		return null
	}
	return str.startsWith("A")
}

fun startsWithA3(str: String?): Boolean {
	return str?.startsWith("A") ?: false

	if(str == null) {
		return false
	}
	return str.startsWith("A")
}

fun startsWith(str: String?): Boolean {
	// 절대 null이 아닌 경우
	return str!!.startsWith("A")
}

크래스 플랫폼

플랫폼 타입

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 startWithA(str: String): Boolean {
	//여기서 에러남
	//@Nullable annotation을 읽어서 판단하기 때문
	//지우면 에러 사라짐
	return str.startsWith("A")
}