minwoorich / 2024-spring-jpa-study

4 stars 5 forks source link

자바 자유변수가 뭔가요? #25

Closed minwoorich closed 4 months ago

InitTester commented 5 months ago

람다식 사용할때 ()안에 선언되는 지역변수 ?? 지역변수면 Heap 영역에 저장.. ??

minwoorich commented 4 months ago

헉 ㅋㅋㅋㅋㅋㅋㅋ 이거 테스트용으로 올린건데 답변을 달아주셨군요 ㅋㅋㅋ

실은 저도 아직 공부를 안해봐서 대신 참고할만한 자료를 링크로 걸어두겠습니다

https://github.com/woowacourse-study/2022-modern-java-in-action/issues/22 https://velog.io/@jylee9937/Java-Lambda%EC%99%80-Closure%EC%9D%98-%EA%B4%80%EA%B3%84

mulgoms2 commented 4 months ago

람다식에 의해 캡쳐링 된 지역 변수를 자유변수라고 합니다. 람다식 외부에 선언 된 지역변수는 람다식과는 다른 스코프를 갖기 때문에 직접 사용할 수 없습니다. 지역변수는 콜스택에 생성되어 메서드 종료시 함께 사라집니다. 람다식은 컴파일 시점에 람다식 형태에 해당하는 함수형 인터페이스 타입의 구현체로서 익명 객체 인스턴스로 생성 됩니다. 이는 람다식이 heap 메모리 영역에 생성 되는 것을 의미합니다. heap 영역에 생성된 람다와, 스택이 소멸되며 사라지는 지역변수의 스코프는 일치하지 않기 때문에 람다식에서 지역변수를 그대로 사용하는 것은 불가능합니다. 따라서 람다식이 외부에 선언 된 지역변수를 사용하기 위해 읽기전용 복사본을 생성해 가져오게 되는데, 이를 람다 캡쳐링이라고 부릅니다.

이렇게 람다식에 의해 캡쳐링된 읽기전용 복사본 변수는 원본 변수(지역변수) 가 소멸되어도 사라지지 않고 자유롭게 사용가능하기에 자유변수라고 불립니다.