작성
·
222
2
안녕하세요! effectively final 관련 궁금증이 있어 질문드립니다!
Java에서 람다 사용시 effectively final 여야지만 되는 이유가 람다 외부 지역변수를 제어하는 스레드와 람다식을 수행하는 스레드가 서로 다를 수 있고, 지역 변수는 스택에 저장되는데 각 스레드가 다르면 서로의 스택을 공유하지 못하기 때문에 값을 복사하여 사용하는데 이 경우 값이 최신값임을 보장하지 못하기 때문이라고 알고 있습니다.
Kotlin에서는 effectively final 하지 않아도 되는 이유가 잘 이해가 안가서 질문드립니다! 람다 시작 지점에 참조하고 있는 변수들을 모두 포획한다는 것
이 Java에서와 마찬가지로 복사하여 값을 사용하는 것과는 다른 개념인걸까요?
답변 1
2
안녕하세요! JS님~!!! 아이고~~ 너무너무 좋은 질문이십니다!!! 😊 말씀해주신 것처럼 Java는 '멀티 스레드' 환경에서의 애매함을 아예 제거하기 위해 이런 선택을 했다고 저도 알고 있습니다!
반면 코틀린은 '멀티 스레드' 환경에서의 생길 수 있는 문제가 있음을 가져가되, lambda에서 실제 변화하는 var 변수를 쓸 수 있도록 했습니다. lambda에서 실제 변화하는 var 변수를 쓸 수 있어야만 '함수를 진정한 1급 시민'으로 가져갈 수 있기 때문입니다!!
그 방법은 아래 글에서 확인하실 수 있습니다! 요약 드려보자면, Java가 람다를 익명클래스로 변경시킬 때 primitive 지역변수를 활용한다면, Kotlin은 람다를 익명클래스로 변경시킬 때 reference 지역변수를 활용하게 됩니다! 이 reference 안에 실제 값을 담는거죠!
"Java에서와 마찬가지로 복사하여 값을 사용하는 것과는 다른 개념인걸까요?"에 대해 최종 요약드리자면, '변수'를 복사하는 것은 비슷하긴 하지만 코틀린에서는 객체로 한 번 감싼 뒤 '변수'를 복사함으로써 람다에서 원본 local variable의 값을 변경할 수 있도록 했습니다! 그래야 함수를 진정한 1급시민으로 사용할 수 있기 때문입니다!!
정말 좋은 질문 남겨주셔서 감사드립니다!!! 또 궁금한 점 있으시면 편하게 질문 주셔요~!! 🙏🙏
상세한 답변 감사드립니다! 링크주신 것도 감사합니다!