🔍 지역 클래스의 내포 클래스는 반드시 inner 클래스여야 한다

구문 영역(lexical scope)에 따른 변수 가시성 규칙이 지역 클래스 안의 내포된 클래스에서만 동작하지 않으면 얼핏 혼동을 야기하기 쉽다.

1. 구문 영역 (Lexical Scope)이란?

Lexical Scope는 "변수의 유효 범위(Scope)는 코드를 작성한 구조에 따라 결정된다"는 규칙입니다.

fun outerFunction() {
    val outerVar = 10 // outerFunction의 영역

    fun innerFunction() {
        val innerVar = 20 // innerFunction의 영역
        println(outerVar) // ✅ innerFunction 안에서 outerVar 접근 가능!
        println(innerVar) // ✅ innerVar도 접근 가능
    }

    innerFunction()
    // println(innerVar) // ❌ 에러! outerFunction에서 innerVar 접근 불가능!
}

위 코드에서 innerFunctionouterFunction 안에 작성되었습니다. 이게 바로 구문 영역입니다. innerFunctionouterFunction의 "자식" 또는 "내부" 영역에 있다고 볼 수 있죠.


2. 구문 영역에 따른 변수 가시성 규칙

이것이 우리가 코드를 읽고 이해할 때 자연스럽게 기대하는 방식입니다. 코드가 중첩되어 있으면, 안쪽 코드는 바깥쪽 코드에 선언된 변수들을 "알고 있을" 것이라고 예상하죠.


3. "규칙이 동작하지 않으면 혼동을 야기한다"는 말의 의미는? 🤔

이제 원래 문장으로 돌아가 봅시다:

"구문 영역(lexical scope)에 따른 변수 가시성 규칙이 지역 클래스 안의 내포된 클래스에서만 동작하지 않으면 얼핏 혼동을 야기하기 쉽다."

이 문장은 다음과 같은 상황을 경고하는 것입니다.

fun main(args: Array<String>) {
    class LocalFoo { // 지역 클래스
        val length = args.size // ✅ LocalFoo는 main의 args에 접근 가능 (자연스러움)
    }
}