인프런 커뮤니티 질문&답변

도토리님의 프로필 이미지
도토리

작성한 질문수

김영한의 실전 자바 - 중급 1편

지역 클래스 - 지역 변수 캡처3

지역 클래스 인스턴스 생성 전에 지역변수의 값 변경

작성

·

160

·

수정됨

0

public class LocalOuterV4 {

    public Printer process(int paramVar) {

        int localVar = 1;

        class LocalPrinter implements Printer {
            @Override
            public void print() {

                System.out.println("localVar = " + localVar); // 지역클래스가 접근하는 지역변수 (1)
                System.out.println("paramVar = " + paramVar); // 지역클래스가 접근하는 지역변수 (2)
            }
        }

        paramVar = 20;
        localVar = 10;

        Printer printer = new LocalPrinter(); // 지역 클래스의 인스턴스를 생성할 때, 지역 클래스가 사용하는 지역변수를 캡쳐해서 멤버로 포함시킨다.
        return printer;
    }
}

위 코드와 같이 LocalPrinter 인스턴스를 생성하기 전에 paramVar와 localVar의 값을 수정하려고 했습니다. 그러면 지역변수 캡쳐 전이니까 2, 1이 아닌 바뀐 20, 10을 캡쳐해서 지역 클래스의 인스턴스에 포함시키면 되겠다고 생각했습니다.

그런데, paramVar와 localVar의 값을 수정하는 코드를 new LocalPrinter()의 이후에 적든, 이전에 적든에 관계없이 컴파일 오류가 발생합니다.

제가 생각한 이유는 이미 자바 차원에서, 지역클래스가 사용 중인 지역변수는 값이 바뀌는 것 자체를 막아두었기 때문이라고 생각합니다. 제 생각이 맞는지 알려주시면 감사하겠습니다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.

도토리님의 질문은 지역 클래스에서 사용하는 지역변수의 값 변경과 캡처에 관한 이해가 중심입니다. Java에서의 지역 클래스 및 익명 클래스가 외부 메소드의 지역변수를 사용할 때, 해당 변수들은 사실상 최종(final) 상태가 되어야 합니다. 즉, 변수를 변경할 수 없다는 의미입니다. 이 규칙은 Java의 동시성과 데이터 일관성을 유지하기 위해 설계된 부분입니다. 도토리님의 이해가 맞습니다; 지역 클래스 또는 익명 클래스가 사용 중인 지역변수는 값의 변경을 허용하지 않습니다. 이는 해당 지역변수들이 final이거나 실질적으로 final인 상태로 취급되기 때문입니다.

이전 질문 “사실상 final 변수에 관하여 (값의 변경에 관한 질문입니다)“에서 비슷한 주제에 대한 설명이 있습니다. 이 질문에서는 지역변수가 지역 클래스 또는 익명 클래스 내에서 사용될 때, 해당 변수들이 어떻게 최종적인 상태로 취급되는지에 대해 설명하고 있습니다. 질문자는 지역변수의 값을 변경하려고 했으나 Java 언어의 설계 원칙 때문에 그러한 변경이 허용되지 않는다는 것을 확인하였습니다.

이 설명은 지역 클래스 인스턴스 생성 전후에 지역변수의 값 변경이 왜 허용되지 않는지에 대한 도토리님의 질문에 대한 체계적인 이해를 돕기에 충분할 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

도토리님의 프로필 이미지
도토리

작성한 질문수

질문하기