• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

effectively final 관련 질문드립니다!

22.09.06 23:12 작성 조회수 147

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급시민으로 사용할 수 있기 때문입니다!!

 

정말 좋은 질문 남겨주셔서 감사드립니다!!! 또 궁금한 점 있으시면 편하게 질문 주셔요~!! 🙏🙏

 

 

luca님의 프로필

luca

질문자

2022.09.07

상세한 답변 감사드립니다! 링크주신 것도 감사합니다!