Variable used in lambda expression should be final or effectively final
람다 실행시에 실행되던 메소드의 스택 영역에 저장되는 외부 변수들에 대해서는 참조만 가능하고 값 변경은 불가
→ final or effectively final 변수만 사용 가능한 이유
외부 Reference type 변수에 대한 변경은 힙 메모리 데이터를 변경하는것이기 때문에 가능
(변수 초기화 같은 스택 참조값 변경은 동일하게 불가)
위 현상들의 이유는 람다가 실행될때 람다 캡처링이 일어나면서 발생하는 현상
- 람다 캡처링이 일어나게되면
-람다의 새로운 스택을 생성
실행되고있던 메소드의 스택 데이터들을 그대로 가져와서 람다의 스택에 그대로 복사 (call by value)
근데 왜 변수 값 변경은 불가하지?
- 람다의 스택에 있는 Primitive type 변수를 변경하게 되면 실행되던 기존 메소드의 스택에는 변경한 값을 반영할 방법이 없음
- Reference type변수들은 데이터를 변경해도 참조를 변경하는것이 아니라 힙 영역의 데이터를 변경하는것이기 때문에 가능