• [1] s1은 null 참조일 수 없다. 지금까지 이 책에서 정의했던 모든 var와 val은 자동으로 널이 될 수 없다.
• [2] 오류 메시지는 ‘null can not be a value of a non-null type String’이다(널이 될 수 없는 타입인 String 타입의 값으로 null을 지정할 수는 없다는 뜻).
• [3] null 참조를 저장할 수 있는 식별자를 정의하려면 타입 이름 뒤에 ?를 붙인다. 이렇게 정의된 식별자는 null이나 정상적인 값을 모두 담을 수 있다.
• [4] null과 정상적인 값을 널이 될 수 있는 타입의 식별자에 대입할 수 있다.
• [5] 널이 될 수 있는 타입의 식별자를 널이 될 수 없는 타입의 식별자에 대입할 수는 없다. 코틀린은 ‘Type mismatch: inferred type is String? but String was expected’라는 오류를 표시한다(String? 타입이 추론됐는데 이 위치에는 String 타입의 값이 필요하다는 뜻). 여기서는 실제 값이 널이 아닌 값이지만("abC"라는 사실을 안다), 코틀린은 타입이 다르기 때문에 대입을 허용하지 않는다.
• [6] 타입 추론을 사용하면 코틀린이 적절한 타입을 만들어낸다. 여기서는 S4가 널이 될 수 있는 타입이므로 S6도 널이 될 수 있는 타입이다.
타입 이름 끝에 ?를 붙여서 기존 타입을 살짝 바꾼 것처럼 보이지만, 실제로는 다른 타입을 지정한 것이다. 예를 들어 String과 String?는 서로 다른 타입이다. String? 타입은 [2]와 [5]가 표시된 줄의 연산을 금지한다. 따라서 널이 될 수 없는 타입의 값이 결코 null이 되지 못하게 해준다.