더북(TheBook)

두 번째 호출의 인자가 널이 될 수 있는 타입의 값이지만, String은 널을 받을 수 있는 타입이 아니기 때문이다. 따라서 이런 호출은 금지된다. isLetterString()에게 널이 전달되지 않는다는 사실을 보장하므로, 함수 자체에서는 널에 대한 검사를 추가로 수행할 필요가 없고 파라미터를 역참조(dereference)할 때 NPE 발생을 걱정할 필요가 없다. 코틀린 컴파일러는 이런 오류를 컴파일 시점에 방지해준다.

자바 vs. 코틀린 이와 반대로 컴파일러 관점에서 볼 때 자바에서 null을 다음 함수에 전달하는 것도 완전히 합법적이다. 하지만 런타임에 NullPointerException이 발생한다.

class Test {
  static booleanisLetterString(String s) {
    for (int i = 0; i<s.length; i++) {
      if (!Character.isLetter(s.charAt(i))) return false;
    }
    return true;
  }
  public static void main(String[] args) {
    // 컴파일은 되지만 런타임에 예외가 발생한다
    System.out.println(isEmpty(null))
  }
}

코틀린에서 널이 될 수도 있는 값을 받는 함수를 작성하려면 어떻게 해야 할까? 이런 경우 파라미터 타입 뒤에 물음표(?)를 붙여서 타입을 널이 될 수 있는 타입으로 지정해야 한다.

fun isBooleanString(s: String?) = s == "false" || s == "true"
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.