Lambda 식을 이용하여 메소드를 작성 할 때, 람다 내부에서 람다 외부 변수를 수정하려고 하면,
위와 같은 에러Variable used in lambda expression should be final or effectively final
가 발생하는데, 이는 람다 캡처링 Lambda Capturing
때문이다.
위와 같은 메모리 구조에서 람다식을 작성하게 되면 아래와 같이 람다 스택을 캡쳐링 하게 되는데,
캡쳐링은 Call by Reference
가 아닌 Call by Value
로 일어난다.
따라서, Call by Value
로 캡쳐링 된 람다 스택 내 변수를 수정하는 것은 컴파일 오류를 발생시키게 된다.
람다 외부 변수는 참조만 가능하다!
추가적으로, 위와 같이 람다 내부에서 람다 외부 컬렉션을 조작(?) 하는 경우는 별다른 에러가 발생하지 않는데,
컬렉션의 경우 데이터가 Stack
이 아닌 Heap
에 저장되어있기 때문이다!