자바 로컬클래스 메서드 변수 사용제한에 대해서 질문드립니다.


책 설명에 의하면 메서드가 종료되면 스택 프레임에서 제거되는데 로컬 클래스 인스턴스는 힙영역에 남아서 메서드의 로컬변수나 파라미터를 사용할 때 문제가 되기때문에 문제 해결을 위해서 자바스크립트처럼 당시 변수를 캡쳐해서 사용하는 것처럼 설명되어있는데 그래서 final로 선언되는 것으로 되어있는데

힙 영역에 남아있는 객체가 다시 사용될 수 있는건가요?

이해가 잘 안됩니다!

  • 2017년 09월 28일에 작성됨

조회수 140


2 답변


책 내용을 그대로 옮겨주시기 바랍니다.

final 은 상수, 읽기전용 즉 수정불가 타입의 선언입니다. final 로 선언한다 해서 스택에 생성하지는 않습니다.

jvm은 가비지 컬렉터에 의해 메모리 관리를 합니다. 개발자가 끼어들 수 있는 방법은 없습니다.(물론 System.gc 호출은 제외)

jvm의 gc알고리듬중에 제네레이셔널 알고리듬이면 기본적으로 copying 알고리듬이고 mark and sweep 으로 가비지를 정리합니다.

삭제하기로 되어 있는 것(mark)을 취소하고 재활용하는 방법은 없는 것으로 압니다.

가비지는 mark후에 sweep 해서 한번에 처리합니다.

당연히 어디선가 참조되는 객체라면 mark를 하지 않습니다.

  • 2017년 10월 01일에 작성됨


클로저에 대해 말씀하시는거같은데 자바의 클로저는 자바스크립트의 클로저와는 다르게 구현되어있습니다. 자바스크립트보다 훨씬 제약이 심하죠(readonly).

자바는 내부 객체가 외부 변수를 캡쳐할 경우 외부 변수에 참조를 가져오는게 아니고 값을 복사해옵니다. 즉 외부변수는 외부변수대로있고 그걸 그대로 복사해서 내부객체의 영역에 가져오는겁니다. 이렇게할경우 어떤 문제가 있냐면 내부에서 자기자신의 변수를 수정하거나 혹은 외부에서 자기자신의 변수를 수정하더라도 서로간의 동기화가 되지않는겁니다. 일단 복사해왔기때문에 이제는 그냥 다른 변수가된거죠. 하지만 개발자들은 그렇게 받아들이지않고 외부의 변수를 내부에서 수정했으니 외부도 적용되기를 기대할것입니다. 하지만 구현이 그렇게 되어있지않으므로 내부에서 외부변수를 참조할경우 final이 되도록 만들어버렸습니다. 강제적으로 final이 되니 외부, 내부에서 수정을 아예 못하도록 만들어버린거죠.

반대로 자바스크립트는 값을 가져오는게 아니라 변수의 참조를 가져옵니다. 그래서 외부에서 값을 변경할수도, 내부에서 값을 변경할수도있으며 값을 변경하면 그 변경된 값이 유지됩니다. 굳이 자바스크립트를 언급할 필요는 없을거같은데 본문에 자바스크립트가 언급되어 덧붙입니다.

  • 2017년 10월 03일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close