지역 클래스 지역 변수 캡처

공부·2024년 12월 7일

:: 지역 클래스

  • 외부 클래스 안의 구현 된 메서드에 지역 클래스를 하나 생성 시 이 것을 지역 클래스 라고 함
        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(); // 이 인스턴스도 지역 변수, 그러나 인스턴스이기에 힙 영역에 생성
        //localPrinter.print(); // 여기서 실행하지 않고 Printer 인스턴스만 반환한다.
        return printer;

  • 지역 클래스는 위의 코드와 같이 작성되며 생성된다.

  • 지역 클래스는 접근 제한자를 사용할 수 없다. (private,public 등)

  • 지역 클래스도 하나의 클래스이기에 상속을 받을 수 있다.

    그렇다면, 지역 변수는 왜 메서드가 실행 후 스택 프레임에서 사라질 때 같이 사라지지 않고
    printer.print(); 명령어를 통해 main영역에서 실행 시 값이 동일히 출력이 되는가?
    그 이유는 지역 변수 캡처라는 기능 때문이다.


    :: 지역 클래스의 지역 변수 캡처

  • 지역 클래스가 생성이 되고 지역 클래스에서 외부 클래스의 변수를 참조할 때 캡처를 해서 복사해둔다.
  • 복사 된 지역 변수는 절대 바뀌어선 안 되는데 바꿀 방법도 없다.
  • 지역 클래스에 사용되는 지역 변수는 사실상 상수(final)로 처리되어 있는거나 다름없기 때문 (effectively final)
  • 지역 변수를 final int paramVar , final int localVar 처럼 명시를 해주는게 좋다.

마무리

강의를 듣던 중 정말 이해하기가 어렵다. 하는 부분들만 따로 정리하는 중인데

현재까진 시간 관련 부분들을 다루는 파트가 가장 어려웠고,

정적 중첩 클래스나, 내부 클래스 정도는 쉽게 이해를 했고 지역 클래스도

지역 변수 캡처 라는 개념이 나오기 전 까진 이해를 하기가 수월했었다.

자바 스크립트를 배운 적은 없지만, 클로저라는게 어떤 것인가. 라는 부분을 어디선가

접해본 적이 있어서 아, 클로저와 비슷한 느낌이네. 라는 추상적인 느낌을 가지고 이해를 하던 중

지역 변수 캡처라는 개념이 나오면서 메서드가 담고 있던 지역 변수는 메서드를 종료하면서

사라지는데 어떻게 종료되어 스택 프레임 밖으로 GC당한 지역 변수를 되살려서

다시 복원해내는가. 라는 부분이 처음에는 이해하기 어려웠지만 지금 생각을 해보면

아주 간단한 해결책으로 지역 클래스가 생성되고 그 클래스가 참조하고 있는 지역 변수를

복사를 해 두면 되겠구나. 라는게 이해가 되면서 이 중첩 클래스 혹은 내부 클래스 라고 불리는

섹션도 재미있는 파트라고 느껴졌다.

그리고 마지막은 익명 클래스. 위에 언급했던 클로저라는 기능과 가장 가깝게 느껴졌던게

이 익명 클래스인데 구현과 생성하는 방식이 독특하다고 생각했다.

이렇게 한다면 말 그대로 익명성도 보장될 수 있고 한 번 사용하고 지역 변수가 단에서

구현되는거라 바로 폐기 시켜서 메모리 관리도 할 수 있으면서 제 기능까지 챙기고

이걸 적재적소에 자유자재로 다룰 수 있다면 유연성이나 일회성으로 사용하니까 간결성까지

챙겨서 강력한 코드를 구현해낼 수 있을 것 같지만, 아직 나에게는 먼 미래이다.

0개의 댓글