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

한재님의 프로필 이미지
한재

작성한 질문수

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

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

작성

·

92

0

package nested.local;

import java.lang.reflect.Field;

public class LocalOuterV3 {

    private int outInstanceVar = 3;

    public Printer process(int paramVar) {

        int localVar = 1; //지역 변수는 스택 프레임이 종료되는 순간 함께 제거된다.

        class LocalPrinter implements Printer{
            int value = 0;

            @Override
            public void print() {
                System.out.println("value = " + value);

                //인스턴스는 지역 변수보다 더 오래 살아남는다.
                System.out.println("localVar = " + localVar);
                System.out.println("paramVar = " + paramVar);
                System.out.println("outInstanceVar = " + outInstanceVar);
            }
        }

        LocalPrinter printer = new LocalPrinter();
        //printer.print();를 여기서 실행하지 않고 Printer 인스턴스만 반환한다.
        return printer;
    }

    public static void main(String[] args) {
        LocalOuterV3 localOuter = new LocalOuterV3();
        Printer printer = localOuter.process(2);

        //printer.print()를 나중에 실행한다. process()의 스택 프레임이 사라진 이후에 실행
        printer.print();

        //추가
        System.out.println("필드 확인");
        Field[] fields = printer.getClass().getDeclaredFields();
        for (Field field : fields) {
            System.out.println("field = " + field);
        }
    }
}

 

안녕하세요 이 부분에서 막혀서 이 강의만 3번째 듣는데도 이해가 안가서 기본편의 섹션 7 자바 메모리 구조와 static쪽을 다시 보고 오려는데 그것 말고 위의 코드를 이해하는데 더 필요한 내용이 있을까요?

답변 2

0

안녕하세요. 한재님, 공식 서포터즈 David입니다.

강의 내용 중 특별히 어떤 부분이 이해되지 않는지 조금 더 자세히 함께 남겨주시면 답변에 큰 도움이 될 것 같습니다:)

감사합니다.

한재님의 프로필 이미지
한재
질문자

메인에서 인스턴스를 만들고

LocalOuterV3 localOuter = new LocalOuterV3();

printer 에 paramVar 2를 넣어 메서드를 실행한 다음

Printer printer = localOuter.process(2);

다시 인스턴스를 만들고나서 이걸 리턴하는데

LocalPrinter printer = new LocalPrinter();

이 때 원래 메서드가 끝나면 GC되야할 지역변수가 인스턴스 내부에 값이 남아있는 걸까요?

 

원래라면

Printer printer = localOuter.process(2);

이 코드 실행 이후에 process 메서드에 파라미터로 들어오는 paramVar, localVar가 읽히지 않아야 하는데, printer를 리턴해서 인스턴스 내부에 값이 남아 출력되는걸로 이해했는데 이게 맞을까요?

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 한채님

메서드가 끝난다고 GC가 되지는 않습니다 🙂

더는 참조하는 곳이 없을 때 GC의 대상이 됩니다.

이 경우 참조값이 반환되고, 해당 참조값을 또 다른 지역변수에서 계속 알 수 있기 때문에 GC의 대상이 되지 않습니다.

감사합니다.

 

0

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

한재님의 질문을 보니, Java의 지역 클래스와 지역 변수 캡처에 관한 이해가 필요한 것 같습니다. 특히 지역 변수가 어떻게 지역 클래스에 의해 캡쳐되고, 이들이 어떻게 메모리에서 관리되는지에 대한 부분이 핵심적인 관심사로 보입니다.

질문하신 부분은 주로 Java의 내부 클래스와 스코프, 그리고 메모리 관리에 대한 이해가 필요합니다. 이와 관련하여, 이전에 비슷한 주제로 질문하신 분들을 위한 답변들 중에서 특히 지역 변수 캡처와 관련된 설명이 포함된 답변이 있습니다. 이 설명들은 지역 클래스의 작동 방식과 지역 변수가 어떻게 캡처되며 사용되는지에 대한 좋은 이해를 제공할 수 있습니다.

  • 지역 클래스-지역 변수 캡쳐2 질문에서는 지역 변수와 파라미터 변수가 지역 클래스 내에서 어떻게 사용되는지, 그리고 final이나 사실상 final(Effectively Final)이 되어야 하는 이유에 대해 설명하고 있습니다. 컴파일 최적화와 관련하여 final 사용에 따른 변수 캡처 방식에 대한 설명도 들어 있습니다.

  • 지역 클래스 지역 변수 캡처 질문에서는 process() 메서드 호출과 LocalPrinter 객체 생성 시점을 예로 들어 지역 변수 캡처의 동작 방식을 설명하고 있습니다. 이 내용은 메서드 호출 시점과 객체 생성 시점에 지역 변수의 값이 어떻게 처리되는지 이해하는 데 도움이 됩니다.

이러한 설명은 아마도 질문하신 코드에 대한 이해를 깊게 하는 데에 도움이 될 것입니다. 특히 Java의 메모리 구조와 지역 변수의 스코프 관리에 대한 이해는 이러한 코드를 분석하고 이해하는 데 핵심적인 요소입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

한재님의 프로필 이미지
한재

작성한 질문수

질문하기