람다 캡처링 :: Variable used in lambda expression should be final or effectively final의 이유

Kyle_Kim·2022년 6월 15일
0

웹개발

목록 보기
2/2

Intellij가 알아서 고쳐주던 아래 에러에 대해서 좀 더 깊숙히 알고자 정리하는 글입니다.

Variable used in lambda expression should be final or effectively final

에러에 대한 결론부터

  • 람다 실행시에 실행되던 메소드의 스택 영역에 저장되는 외부 변수들에 대해서는 참조만 가능하고 값 변경은 불가
    → final or effectively final 변수만 사용 가능한 이유

  • 외부 Reference type 변수에 대한 변경은 힙 메모리 데이터를 변경하는것이기 때문에 가능
    (변수 초기화 같은 스택 참조값 변경은 동일하게 불가)

  • 위 현상들의 이유는 람다가 실행될때 람다 캡처링이 일어나면서 발생하는 현상
    - 람다 캡처링이 일어나게되면
    -람다의 새로운 스택을 생성
    실행되고있던 메소드의 스택 데이터들을 그대로 가져와서 람다의 스택에 그대로 복사 (call by value)

  • 근데 왜 변수 값 변경은 불가하지?
    - 람다의 스택에 있는 Primitive type 변수를 변경하게 되면 실행되던 기존 메소드의 스택에는 변경한 값을 반영할 방법이 없음
    - Reference type변수들은 데이터를 변경해도 참조를 변경하는것이 아니라 힙 영역의 데이터를 변경하는것이기 때문에 가능

profile
Make Things Right

0개의 댓글