Lambda와 Inner class의 final 변수

김용진·2021년 11월 26일
0

JAVA 연구일지

목록 보기
6/6

안드로이드를 개발하면서 onClick 메소드를 주로 anonymous class로 정의하여 사용한다.

이때 anonymous class 내부에서 외부 스택 변수를 참조할 때 오류가 발생하는 조건이 있다.

참조하려는 외부 변수가 final로 역할을 할 수 없을 때이다.

JAVA8 이전에는 외부 스택 변수를 final 변수로 선언하거나, 멤버 변수를 사용해야 했다.

다만, JAVA8 이후로 직접적인 final 선언 없이 외부 스택 변수가 수정되지 않으면 에러가 발생하지 않고 사용할 수 있었다.

이런 제약이 발생하는 이유는 JAVA는 직관적인 철학을 따르기 때문이다.

내부 원리로는 Lambda와 Inner class에서 외부 스택 변수를 참조하는것이 아니라, 외부 스택 변수 값을 복사하여 자기(스레드) 스택에 따로 저장하는 것이다. 그래서 외부 스택 변수가 소멸되도 그 안에서는 따로 살아나 있는것이다.

결론적으로, 역시 제약에는 다 이유가 있다는것을 느끼고 간다.

profile
연구하는 프로그래머

0개의 댓글