Java/Java 8

(더 자바) 람다 표현식

필리힐리 2021. 8. 16. 22:42

*개인적인 공부를 위해 인프런에 있는 백기선님의 강의를 정리하는 글입니다.

https://www.inflearn.com/course/the-java-java8/dashboard

 

더 자바, Java 8 - 인프런 | 강의

자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합니다. 이

www.inflearn.com

*변수 캡쳐링, 이팩티브 파이널 변수 참고한 블로그

https://vagabond95.me/posts/lambda-with-final/

 

[Java] lambda 와 effectively final - 기록은 기억을 지배한다

자바 8에서 추가된 람다식에는 다음과 같은 규칙이 존재한다. 람다식은 외부 block 에 있는 변수에 접근할 수 있다. 외부에 있는 변수가 지역 변수 일 경우 final 혹은 effectively final 인 경우에만 접

vagabond95.me

https://yadon079.github.io/2021/java%20study%20halle/week-15

 

15주차 과제: 람다식. :: 개발자 한선우

해당 글을 백기선 님의 자바 스터디 15주차 과제를 공부하고 공유하기 위해서 작성되었습니다.

yadon079.github.io

 

변수 캡쳐링 (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 부터 생긴 개념이다.

 

내부 클래스, 익명 클래스 그리고 람다식

내부 클래스와 익명 클래스는 그 내부 (스코프 안)에 있는 지역 변수를 참조할 수 있지만

람다는 스코프가 부모 클래스와 동일하기 때문에 참조가 불가능하다.