LostCatBox

Java Lambda-Capturing

Word count: 290Reading time: 1 min
2022/12/25 Share

람다 캡처링

Created Time: September 24, 2022 10:47 PM
Last Edited Time: December 23, 2022 5:38 PM

:: Variable used in lambda expression should be final or effectively final의 이유

1

  • 람다 실행시에 실행되던 메소드의 스택 영역에 저장되는 외부 변수들에 대해서는 참조만 가능하고 값 변경은 불가→ final or effectively final 변수만 사용 가능한 이유
  • 외부 Reference type 변수에 대한 변경은 힙 메모리 데이터를 변경하는것이기 때문에 가능(변수 초기화 같은 스택 참조값 변경은 동일하게 불가)

람다는 항상 새로운 스택 생성된다.

2

3

  • 위 현상들의 이유는 람다가 실행될때 람다 캡처링이 일어나면서 발생하는 현상
    • 람다 캡처링이 일어나게되면
      • 람다의 새로운 스택을 생성
      • 실행되고있던 메소드의 스택 데이터들을 그대로 가져와서 람다의 스택에 그대로 복사 (call by value)
    • 근데 왜 변수 값 변경은 불가하지? → 결국 외부 변수가 가르키는 주소값변경이일어나면안됨!
      • 람다의 스택에 있는 Primitive type 변수를 변경하게 되면 실행되던 기존 메소드의 스택에는 변경한 값을 반영할 방법이 없음
      • Reference type변수들은 데이터를 변경해도 참조를 변경하는것이 아니라 힙 영역의 데이터를 변경하는것이기 때문에 가능

참고로 기본 타입은 스택에 실제로 값을 저장하지만 참조 타입은 메모리의 주소값을 변수 안에 저장한다.

Untitled

5

https://brownbears.tistory.com/519

https://yaboong.github.io/java/2018/05/26/java-memory-management/

함수 호출시 매개변수로 참조변수를 넣을떄는 참조변수의 값인 주소값이 복사되어들어간다.

불변 참조 객체는 변경시 새로운 객체를 만든다. 반드시 주소값이 바뀜 (String포함)

Immutable Object 는 불변객체로써, 값이 변하지 않는다. 변경하는 연산이 수행되면 변경하는 것 처럼 보이더라도 실제 메모리에는 새로운 객체가 할당되는 것이다.

자바에서 Wrapper class 에 해당하는 Integer, Character, Byte, Boolean, Long, Double, Float, Short 클래스는 모두 Immutable 이다. 그래서 heap 에 있는 같은 오브젝트를 레퍼런스 하고 있는 경우라도, 새로운 연산이 적용되는 순간 새로운 오브젝트가 heap 에 새롭게 할당된다.

따라서, 람다안에서 참조값이 바뀌는 외부의 String 값을 변경할수는없지만, 배열에서 add,remove와 같은 불변객체가 아닌 값은 변경가능하고, 참조값도 변경되지않으므로, 가능하다.

추가학습 필요

불변 객체란?

[https://velog.io/@conatuseus/Java-Immutable-Object불변객체](

CATALOG
  1. 1. 람다 캡처링
    1. 1.1. 람다는 항상 새로운 스택 생성된다.
  2. 2. 추가학습 필요