Notice
Recent Posts
Recent Comments
Link
Hello, Android!
클로저 본문
클로저는 람다식 또는 함수 내부에서 외부에 선언된 변수에 접근하는것을 의미한다
위의 코드에서는 addNum함수 호출시 넘겨주는 람다식에서 main의 지역 변수인 result에 값을 할당하고있다
result는 main함수의 지역변수이기때문에, 람다식의 범위 밖이라 x+y의 값을 result에 할당하는것이 불가능 할것 같지만
코틀린에서는 클로저를 지원하기때문에 외부 변수인 result에 접근이 가능하다
이렇게 람다식 내부에 있는 외부 변수를 포획(captchure)한 변수라고 한다
지역변수들은 서로 다른 스택에 저장이 되어 함수가 종료되면 사라진다
하지만 클로저가 포획한 변수는 참조가 유지되어, 함수가 종료되어도 사라지지 않는다
이러한 클로저에도 조건이 있다
- final 변수를 포획한 경우 변수 값을 람다식과 함께 저장한다
- final이 아닌 변수를 포획하는 경우 래퍼로 감싸서 참조 가능하게 하며, 래퍼에 대한 참조를 람다식과 함께 저장한다
조건에 따르면 위의 경우는 result는 final이 아니기때문에 래퍼에 변수로 담고 그 래퍼를 final 변수에 담아
변수의 참조값을 람다식과 함께 저장을 하게된다
- 클로저 사용 예
안드로이드에서 자바로 위와 같은 코드를 작성하는것은 불가능하다
리스너를 익명 객체로 만들어서 외부의 a를 참조하는데 a가 final변수가 아니기 때문에 참조가 불가능하다
하지만 코틀린의 경우 클로저를 지원하기때문에 위와 같은 코드가 가능하다
'Kotlin' 카테고리의 다른 글
Scope Function also (0) | 2020.07.25 |
---|---|
Scope Function let (0) | 2020.07.24 |
시퀀스 (0) | 2020.07.22 |
컬렉션 검색, 분리, 병합, 정렬 (0) | 2020.07.21 |
컬렉션 잘라내기, 매핑 (0) | 2020.07.21 |