안드로이드를 개발하면서 onClick 메소드를 주로 anonymous class로 정의하여 사용한다.
이때 anonymous class 내부에서 외부 스택 변수를 참조할 때 오류가 발생하는 조건이 있다.
JAVA8 이전에는 외부 스택 변수를 final 변수로 선언하거나, 멤버 변수를 사용해야 했다.
다만, JAVA8 이후로 직접적인 final 선언 없이 외부 스택 변수가 수정되지 않으면 에러가 발생하지 않고 사용할 수 있었다.
이런 제약이 발생하는 이유는 JAVA는 직관적인 철학을 따르기 때문이다.
내부 원리로는 Lambda와 Inner class에서 외부 스택 변수를 참조하는것이 아니라, 외부 스택 변수 값을 복사하여 자기(스레드) 스택에 따로 저장하는 것이다. 그래서 외부 스택 변수가 소멸되도 그 안에서는 따로 살아나 있는것이다.
결론적으로, 역시 제약에는 다 이유가 있다는것을 느끼고 간다.