Final이 궁금하다 (feat. Lambda)
Updated: Categories: JavaFinal은 무엇이고 어떻게 동작할까?
Final
그게 뭔데?
- final은 객체, 클래스, 메소드 모두에게 부여할 수 있다.
- 정의나 선언시에 final을 붙이게 되면 만들 때의 상태가 고정값이 되며, 더 이상의 변경은 불가하다.
- 약간 constant?? 상수?같은 느낌임 🤔
Effectively final
- Java 8 에 추가된 syntactic sugar의 일종 (문법적인 의미)
- 변수가 초기화 된 이후 값이 한번도 변경되지 않았다면 Final과 동일하게 컴파일러에서 처리하는 것.
Lambda Final
지역 변수 사용
- Lambda에서 지역변수를 사용하려면 그 변수가 fianl/Effectively final 이어야 한다.
- 그 이유는 변수가 저장되는 공간과 쓰레드를 이해해야 한다.
- Lambda가 실행될땐 새로운 쓰레드가 만들어져 실행되기에 Main 쓰레드의 지역변수는 사용할 수 없다.
- 따라서 공유 변수를 사용하려면 모든 쓰레드가 접근 가능한 Final 변수를 사용해야한다.
변수 변경
- 또 이런 멀티쓰레드환경에서는 동시성 문제가 발생하기 때문에 변수의 변경을 막아놓았다.
- 따라서 멀티쓰레드환경에서 변수 변경이 필요할 땐
Atomic
으로 변수를 선언해야 한다. Atomic
은 CAS(Compared And Swap) 알고리즘을 통해 구현된다
참고
- https://beomseok95.tistory.com/225
- https://vagabond95.me/posts/lambda-with-final/