람다 표현식에서는 익명 함수가 하는 것처럼 자유 변수를 활용할 수 있다. 이를 람다 캡처링이라고 한다.
int portNumber = 8080;
Runnable r = () -> System.out.println(portNumber);
이 코드는 컴파일이 된다.
하지만 자유 변수에도 제약이 있다.
람다는 인스턴스 변수와 정적 변수를 자유롭게 자신의 바디에서 참조할 수 있도록 할 수 있다.하지만 그러기 위해서는 지역 변수는 명시적으로 final로 선언되어 있어야 하거나 실직적으로 final로 선언된 변수와 똑같이 사용되어야 한다.
int portNumber = 8080;
Runnable r = () -> System.out.println(portNumber);
portNumber = 3307;
이 코드는 컴파일 에러가 뜬다 portNumber가 final은 아니지만 람다에서 지역변수를 사용할려면 실질적으로 final로 선언된 변수와 같이 사용되어야 하는데 재할당을 할려고해서 에러가 발생한다.
이유는 인스턴스 변수는 힙에 저장되지만 지역 변수는 스택에 위치한다.
자바 구현에서는 원래 변수에 접근을 허용하는 것이 아니라 자유 지역 변수의 복사본을 제공한다. 따라서 복사본의 값이 바뀌지 않아야 하므로 한 번만 값을 할당해야 한다는 제약이 생긴다.
'자바' 카테고리의 다른 글
순차 스트림 VS 병렬 스트림 (0) | 2025.01.21 |
---|---|
FACTORY 패턴 (2) | 2024.12.20 |
디미터 법칙과 캡슐화 (0) | 2024.12.19 |
POLYMORPHISM 패턴 (0) | 2024.12.19 |
캡슐화 (0) | 2024.12.16 |