inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

223

도토리

작성한 질문수 92

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()의 이후에 적든, 이전에 적든에 관계없이 컴파일 오류가 발생합니다.

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

java 객체지향

답변 1

0

인프런 AI 인턴

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

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

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

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

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

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

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

문제와 풀이

0

25

1

섹션 2 퀴즈 9번

0

34

2

강의노트 내용이 이해가 되지 않아서 문의드립니다.

0

48

1

중급1편, 래퍼클래스 문제와풀이2 로또제너레이터 질문

0

68

1

setVlaue질문

0

95

3

안녕하세요 코딩테스트와 병행하고 싶어서 질문드립니다.

0

95

1

findValue의 파라메터까지 래퍼클래스 배열인 이유가 있을까요?

0

76

1

아래 글처럼 toString() 강의부터 화면이 안보여요

0

99

2

TemporalAdjusters의 lastDayOfNextMonth(), lastDayOfNextYear() 메서드 지원 안함

0

84

2

오타 제보도 되나요?

0

91

2

지역 클래스 예제3 지역변수 질문

0

69

2

래퍼클래스 박싱 출력

0

60

1

자바 equals() 메소드에 대한 물리적 동일성, 논리적 동등성 질문

0

107

3

강의록 오타 제보

0

69

2

자바의 기본 클래스들에 관하여

0

71

1

실무에서 중첩(내부) 클래스 사용하나요?

0

80

1

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

0

56

1

12:30 의 newClassGrade 질문이 있습니다.

0

57

1

날짜와 시간 문제풀이가 막히는데

0

100

2

내부 클래스의 바깥 클래스 참조

0

68

1

스트링 풀, new String()

0

105

3

정적 중첩 클래스 사용 이유

0

97

1

status.getCode() 대신 status.code 사용

1

82

1

메서드의 지역변수명과 내부클래스의 멤버메서드에서의 지역변수명의 중복관련

0

75

1