Final이 궁금하다 (feat. Lambda)

Updated: Categories:

Final은 무엇이고 어떻게 동작할까?

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/