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.annotaionandroid.support.annotationorg.jetbrains.annotationimport 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이 들어와도 컴파일 에러가 발생하지 않는다.