더북(TheBook)

불변 변수는 값이 바뀌지 않기 때문에 래퍼가 필요 없으므로 이런 부가 비용이 없다.

내포된 클래스와 달리 지역 클래스에는 가시성 변경자를 붙일 수 없다. 지역 클래스의 영역은 항상 자신을 둘러싼 블록으로 제한된다. 지역 클래스도 함수, 프로퍼티, 생성자, 내포된 클래스 등 다른 클래스가 포함할 수 있는 모든 멤버를 포함할 수 있다. 하지만 내포된 클래스는 반드시 inner 클래스여야만 한다.

fun main(args: Array<String>) {
  class Foo {
    val length = args.size
    inner class Bar {
      val firstArg = args.firstOrNull()
    }
  }
}

지역 클래스 안에 내부 클래스가 아닌 내포된 클래스를 허용하지 않는 이유는 무엇일까? 지역 클래스는 자신을 둘러싼 지역적인 상태(이 예제에서는 args)에 접근할 수 있다. 하지만 내포된 클래스의 특성상 지역 클래스 안에 있는 내포된 클래스는 자신의 외부 클래스에서 사용할 수 있는 상태에 접근할 수 없는데, 구문 영역(lexical scope)에 따른 변수 가시성 규칙이 지역 클래스 안의 내포된 클래스에서만 동작하지 않으면 얼핏 혼동을 야기하기 쉽다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.