*개인적인 공부를 위해 인프런에 있는 백기선님의 강의를 정리하는 글입니다.
https://www.inflearn.com/course/the-java-java8/dashboard
*변수 캡쳐링, 이팩티브 파이널 변수 참고한 블로그
https://vagabond95.me/posts/lambda-with-final/
https://yadon079.github.io/2021/java%20study%20halle/week-15
변수 캡쳐링 (Variable Capturing)
메서드 내부 클래스 (Local Class), 익명 클래스 (Anonymous Class), 람다식 (Lamda)은 외부 지역 변수를 참조할 수 있는데 다음과 같은 문제가 발생할 수 있다.
객체는 new를 통해 instance화 시켜 사용하는데 heap 영역에 저장되지만 외부 지역변수는 stack 영역에 저장이 된다.
즉 지역변수가 stack에서 빠졌는데 heap 영역에 남아 있는 객체가 지역변수를 참조하려고 하면 문제가 생긴다.
이를 해결하기 위해 Variable Capturing이라는 값 복사 기술을 사용한다.
* 런타임으로 stack의 값이 변하기 전 컴파일 시점에 값을 복사해 둔 뒤 참조로 사용
단 위 예시처럼 값이 변하면 문제가 발생할 수 있기 때문에 final 또는 effective final이어야 사용이 가능하다.
* Effective final이란 초기화 이후 아무런 값으 변경이 없는 사실상 final 변수라는 의미이다.
* Effective final은 JAVA8 부터 생긴 개념이다.
내부 클래스, 익명 클래스 그리고 람다식
내부 클래스와 익명 클래스는 그 내부 (스코프 안)에 있는 지역 변수를 참조할 수 있지만
람다는 스코프가 부모 클래스와 동일하기 때문에 참조가 불가능하다.
'Java > Java 8' 카테고리의 다른 글
(더 자바) 자바에서 제공하는 함수형 인터페이스 (0) | 2021.08.04 |
---|---|
(더 자바) 함수형 인터페이스와 람다 (0) | 2021.08.04 |