effectively final 관련 질문드립니다!
273
작성한 질문수 8
안녕하세요! effectively final 관련 궁금증이 있어 질문드립니다!
Java에서 람다 사용시 effectively final 여야지만 되는 이유가 람다 외부 지역변수를 제어하는 스레드와 람다식을 수행하는 스레드가 서로 다를 수 있고, 지역 변수는 스택에 저장되는데 각 스레드가 다르면 서로의 스택을 공유하지 못하기 때문에 값을 복사하여 사용하는데 이 경우 값이 최신값임을 보장하지 못하기 때문이라고 알고 있습니다.
Kotlin에서는 effectively final 하지 않아도 되는 이유가 잘 이해가 안가서 질문드립니다! 람다 시작 지점에 참조하고 있는 변수들을 모두 포획한다는 것이 Java에서와 마찬가지로 복사하여 값을 사용하는 것과는 다른 개념인걸까요?
답변 1
3
안녕하세요! JS님~!!! 아이고~~ 너무너무 좋은 질문이십니다!!! 😊 말씀해주신 것처럼 Java는 '멀티 스레드' 환경에서의 애매함을 아예 제거하기 위해 이런 선택을 했다고 저도 알고 있습니다!
반면 코틀린은 '멀티 스레드' 환경에서의 생길 수 있는 문제가 있음을 가져가되, lambda에서 실제 변화하는 var 변수를 쓸 수 있도록 했습니다. lambda에서 실제 변화하는 var 변수를 쓸 수 있어야만 '함수를 진정한 1급 시민'으로 가져갈 수 있기 때문입니다!!
그 방법은 아래 글에서 확인하실 수 있습니다! 요약 드려보자면, Java가 람다를 익명클래스로 변경시킬 때 primitive 지역변수를 활용한다면, Kotlin은 람다를 익명클래스로 변경시킬 때 reference 지역변수를 활용하게 됩니다! 이 reference 안에 실제 값을 담는거죠!
"Java에서와 마찬가지로 복사하여 값을 사용하는 것과는 다른 개념인걸까요?"에 대해 최종 요약드리자면, '변수'를 복사하는 것은 비슷하긴 하지만 코틀린에서는 객체로 한 번 감싼 뒤 '변수'를 복사함으로써 람다에서 원본 local variable의 값을 변경할 수 있도록 했습니다! 그래야 함수를 진정한 1급시민으로 사용할 수 있기 때문입니다!!
정말 좋은 질문 남겨주셔서 감사드립니다!!! 또 궁금한 점 있으시면 편하게 질문 주셔요~!! 🙏🙏
수업노트
0
76
1
싱글톤과 스프링
0
85
2
get() = 3
0
62
2
강사님
0
84
1
강의 복습하면서 생긴 질문
1
107
1
Kotlin과 Java의 현업에서의 활용
0
143
2
data class와 자바의 Lombok을 이용한 DTO 클래스 차이 질문
0
82
1
코틀린에서 상속 시, 주의점에 대한 질문
1
113
3
내용 이해 질문
0
66
1
자바와 코틀린의 함수형 프로그래밍,
1
96
1
플랫폼 타입 설명 문의
2
88
2
널 아님 단언 관련 질문
0
91
1
강의 중 질문
0
89
2
범위 비교 질문
1
101
2
타입캐스팅 궁금한점 질문드립니다.
1
248
2
코틀린 val 질문
0
174
2
완강 후 Kotlin 이런저런 질문 드려봅니다!
3
418
2
확장함수 스타일 질문
0
147
2
확장 프로퍼티 질문
1
165
1
update 함수를 만든다는게 어떤 의미인지 예시가 궁금합니다!
1
288
1
java class의 NotNull 어노테이션 인식
1
268
1
[16강] 확장함수 관련 질문입니다!
1
136
2
리턴타입 사용시 any를 사용해도 괜찮은가요?
1
145
1
안녕하세요 scope function 에 receiver 가 없는 경우
1
174
1





