inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide)

17강. 코틀린에서 람다를 다루는 방법

effectively final 관련 질문드립니다!

273

luca

작성한 질문수 8

3

안녕하세요! effectively final 관련 궁금증이 있어 질문드립니다!

Java에서 람다 사용시 effectively final 여야지만 되는 이유가 람다 외부 지역변수를 제어하는 스레드와 람다식을 수행하는 스레드가 서로 다를 수 있고, 지역 변수는 스택에 저장되는데 각 스레드가 다르면 서로의 스택을 공유하지 못하기 때문에 값을 복사하여 사용하는데 이 경우 값이 최신값임을 보장하지 못하기 때문이라고 알고 있습니다.

Kotlin에서는 effectively final 하지 않아도 되는 이유가 잘 이해가 안가서 질문드립니다! 람다 시작 지점에 참조하고 있는 변수들을 모두 포획한다는 것이 Java에서와 마찬가지로 복사하여 값을 사용하는 것과는 다른 개념인걸까요?

oop java kotlin

답변 1

3

최태현

안녕하세요! JS님~!!! 아이고~~ 너무너무 좋은 질문이십니다!!! 😊 말씀해주신 것처럼 Java는 '멀티 스레드' 환경에서의 애매함을 아예 제거하기 위해 이런 선택을 했다고 저도 알고 있습니다!

 

반면 코틀린은 '멀티 스레드' 환경에서의 생길 수 있는 문제가 있음을 가져가되, lambda에서 실제 변화하는 var 변수를 쓸 수 있도록 했습니다. lambda에서 실제 변화하는 var 변수를 쓸 수 있어야만 '함수를 진정한 1급 시민'으로 가져갈 수 있기 때문입니다!!

그 방법은 아래 글에서 확인하실 수 있습니다! 요약 드려보자면, Java가 람다를 익명클래스로 변경시킬 때 primitive 지역변수를 활용한다면, Kotlin은 람다를 익명클래스로 변경시킬 때 reference 지역변수를 활용하게 됩니다! 이 reference 안에 실제 값을 담는거죠!

 

"Java에서와 마찬가지로 복사하여 값을 사용하는 것과는 다른 개념인걸까요?"에 대해 최종 요약드리자면, '변수'를 복사하는 것은 비슷하긴 하지만 코틀린에서는 객체로 한 번 감싼 뒤 '변수'를 복사함으로써 람다에서 원본 local variable의 값을 변경할 수 있도록 했습니다! 그래야 함수를 진정한 1급시민으로 사용할 수 있기 때문입니다!!

 

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

 

 

0

luca

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

수업노트

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