miho7724
52
2020-03-17 02:54:26
1
329

중첩 클래스에 관해 여쭤보고 싶습니다.


제가 요즘 이펙티브 자바라는 책을 독학하고 있는데요

nested class (중첩 클래스) 부분을 공부하던 중


"익명 클래스가 비정적인 문맥에서만 사용될 때만 바깥 클래스의 인스턴스를 참조할 수 있다. 정적 문맥에서라도 상수 변수 이외의 정적 멤버는 가질 수 없다. 상수 표현을 위해 초기화된 final 기본 타입과 문자열 필드만 가질 수 있다."


부분이 이해가 안가서 여쭤봅니다 ㅠㅠ

원래 instance 메소드에서는 this 키워드를 사용할 수 있고,

static 메소드에서는 this 키워드를 사용할 수 없는 걸 알고 있지만 정적 문맥에서 상수 변수이외 정적 멤버를 가질 수 없는 이유는 무엇인가요?

0
0
  • 댓글 1

  • fx
    1k
    2020-03-17 08:56:26

    자바 구현상의 한계입니다.


    중첩된 코드블록 구조에서 코드블럭 외부를 참조 하기 위한 여러 방법이 있습니다.


    딘순하게는 컨텍스트(문맥) 공유가 있고

    (ex. if, for, while ...)

    자바스크립트의 중첩 함수처럼 함수체인을 만들수도 있습니다.


    함수체인 방식이라면 바깥쪽 함수의 모든 값에 대해 접근과 변경을 할 수 있게됩니다.


    자바도 클래스 체인 방식으로 중첩클래스가 구현 되었다면 제약이 없었을 것입니다.


    자바 중첩클래스는 참조된 값 또는 참조값을 복사하는 방식으로 중첩클래스를 구현하였습니다. 내부클래스는 생성 되는 시점에 참조하고 있는 외부 클래스의 값(참조 포함)들을 복사합니다.


    내부 클래스가 생성된 후에 참조된 외부클래스의 값이 변하게 된다면, 내부에서 참조하는 값들은 더 이상 유효하지 못하게 됩니다.


    그래서 자바는 중첩시 상수(final)만을 참조 하도록 제한을 두었습니다.


    이 제약은 자바8에서 람다 도입과 함께 조금 완화 되었습니다. 이제는 final이 아니더라도 참조 할 수는 있습니다.

    다만 참조되는 값은 의미적으로는 여전히 상수여만 합니다. 따라서 final로 선언하지 않더라도 값을 변경 할 수는 없습니다.


    해법은 컨테이너를 이용해야 합니다.

    클래스를 정의 해도 되고

    Optional, List, Array 등을 이용해서

    제약을 우회 할 수 있습니다.


    1
  • 로그인을 하시면 댓글을 등록할 수 있습니다.