4장
1 역주 자바에서는 패키지만 같으면 기본 가시성의 멤버를 볼 수 있으므로 .jar로 소스코드 없이 클래스 파일만 배포한 경우에도 사용하는 쪽에서 패키지를 똑같이 선언해 기본 가시성 멤버를 사용하는 일이 가능했고, 대부분의 클래스가 공개나 패키지 클래스이므로 모듈 내부에서만 사용하는 클래스와 모듈 밖으로 노출시켜야 하는 클래스를 구분하기 힘들었다. 이런 문제를 해결하기 위해 자바 9에는 JigSaw 모듈 시스템이 도입됐다. 코틀린은 모듈 내부 가시성을 통해 모듈 안에서만 쓸 수 있는 선언과 그렇지 않은 선언을 구분할 수 있어서 이런 문제를 방지할 수 있다.
2 역주 내포된 클래스와 달리 내부 클래스에는 반드시 자신과 연관된 외부 클래스 인스턴스가 있어야 한다. 내부 클래스가 외부 클래스의 멤버에 접근할 수 있는 이유는 항상 자신과 연관된 외부 클래스 인스턴스가 있기 때문이다. 이를 내부 클래스 안에 컴파일러가 자동으로 정의해주는 외부 클래스 인스턴스를 가리키는 outer 같은 프로퍼티가 있는 것처럼 생각할 수 있다.
3 역주 한 가지 더 심각한 문제는 null 참조가 생기는 시점과 실제 null 참조를 이용하는 시점이 서로 다를 수 있으므로, NPE가 발생한 지점에서 실제 NPE의 원인을 알아내기가 쉽지 않을 수도 있다는 점이다. 이런 문제를 해결할 때 도움이 될 수 있도록 JDK 14부터는 좀 더 개선된 NPE 오류 메시지를 도입했다. https://openjdk.java.net/jeps/358을 살펴보라.
4 역주 다만, 이로 인해 null+null을 하면 NPE가 발생하지 않고 "nullnull"이라는 문자열이 반환된다. 또한, null.toString()도 NPE를 발생시키지 않고 "null"이라는 문자열을 돌려준다. 이 두 가지 동작으로 인해 값을 문자열로 변환하는 과정에서 널 가능성을 실수로 빼먹어도 컴파일되는 경우가 있고, 이로 인해 가끔 예기치 않은 버그가 생길 수 있다.
5 역주 코틀린 1.5부터 toUpperCase(), toLowerCase() 등은 사용 금지 예고(deprecated)됐으므로 그 대신 uppercase() 등을 써야 한다. uppercase()는 로케일과 무관하게 항상 똑같은 방식(영문 대소문자는 변환하지만 다른 문자는 그대로 두는 방식임)으로 대소문자 변환을 보장한다.