← 질문 목록
#357깊이 0
람다식 내부에서 외부 지역변수를 바꿀 수 없는 이유는 무엇인가?
언어 · 런타임
답변 연습
내 답변 적어보기접힘
이 브라우저에 자동 저장 · 0자
모범답안 확인하기내 답변 뒤에 열어보세요
스택에 있는 지역변수와 힙에 있는 람다의 생명주기가 다르기 때문이다.
- 람다 인스턴스힙 영역 (오래 생존)
- 지역 변수스택 프레임 (메서드 종료 시 소멸)
메서드가 끝나면 스택 프레임이 사라진다. 반면 힙에 생성된 람다는 더 오래 살아남을 수 있다. 존재하지 않는 메모리를 참조하는 오동작이 일어난다.
자바는 지역변수의 값을 복사해서 람다에 전달한다. 이 값을 내부나 외부에서 바꾸면 원본과 복사본의 값이 달라진다. 멀티스레드 환경에서 데이터 일관성이 깨진다.
컴파일러는 데이터 일관성을 지키려고 제약을 건다. 람다가 참조하는 지역변수가 바뀌지 않도록 final이나 실질적 final로 제한한다.