일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 벤자민플랭클린
- bash
- Coroutine
- recyclerview
- androidx
- ASMR
- DART
- 오픈소스
- 좋은글필사하기
- 파이썬
- 코틀린
- 이모지
- Linux
- Freesound
- Firebase
- 1인개발자
- jetpack compose
- 장자명언
- Flutter
- 이모지메모
- kotlin
- 명언모음
- 공부집중
- 공자명언
- Android
- 넷플릭스
- 명심보감
- FSM
- Streaming
- 소울칼리버6
Archives
- Today
- Total
Vintage appMaker의 Tech Blog
[kotlin] apply에서 람다 사용시 범위(scope) 본문
Source code or Tip/Android(Java, Kotlin)
[kotlin] apply에서 람다 사용시 범위(scope)
VintageappMaker 2021. 6. 12. 10:24Android에서 코틀린으로 개발하다보면 closure와 람다는 자신의 의지와 관계없이
많이 사용하게 된다. 그러다보니 어느 순간부터 람다식과 closure를 활용한 코딩스타일에 익숙하게 되는데,
그 때 많이 실수하는 것이 람다식의 scope이다.
(1)
{
람다를받는함수( {람다식} )
}
(2)
람다를받는함수(){
{람다식}
}
일반적으로 람다식의 범위는 (1)의 영역인 [람다를받는함수]를 호출하는 영역이다.
그러나 람다를받는함수가 클래스내의 함수(메소드)이고 그 객체를 생성하고 apply를 사용하게 된다면 복잡한 상황이 발생한다.
inerCls와 outerCls의 리소스를 동시에 사용할 수 있다.
2.번의 경우, 호출부(innerCls)와 실행부(outerCls) 범위의 리소스를 모두 액세스 가능하게 된다.
일반적으로는 호출부의 리소스를 실행부에서 사용하려면 3.번과 같이 한다. 그러나 객체를 생성하고 apply에서 사용시에는 두 영역의 리소스를 동시에 사용할 수 있다. 문제는 2.번과 같이 양쪽에 같은 변수명이나 함수가 존재할 때인데, 이때는 기본적으로 호출부(innerCls) 영역을 선택하게된다.
fun main() {
outerCls().apply{
doTest()
}
}
class outerCls {
var name = "base"
var age = 100 / 2 + 2
fun outerFunc() = println ("outer Func")
fun doTest(){
innerCls().apply{
// 1. 넘겨지는 람다(doFunction)의 스코프는 outerCls
doFunction{
// outerCls의 age
println (age)
outerFunc()
}
// 2. 넘겨지는 람다(doFunction)의 스코프는 outerCls 이지만
// doFunction을 호출하는 영역은 innerCls이다.
// 그래서 변수명이 innerCls에서 같은 것이 존재한다면
// innerCls의 변수를 기본적으로 사용하게 된다.
doFunction{
// innerCls의 name
println (name)
// outerCls의 name
println (this@outerCls.name)
// innerCls의 innerFunc()
innerFunc()
}
// 3. 람다(doFunction)에서 innerCls의 자원을 사용하고자 한다면
// innerCls에서 파라메터로 자신을 넘겨주면 된다.
// (*) apply 안에서 사용한다면 doFunction2와 같이
// 할 필요없이 2.번처럼 하면된다.
doFunction2{
inner ->
inner.innerFunc()
}
}
}
}
class innerCls{
var name : String = "inner"
fun innerFunc() = println("innerCls Func")
fun doFunction (fn: () -> Unit){
fn()
}
fun doFunction2 (fn: ( c: innerCls ) -> Unit){
fn(this)
}
}
'Source code or Tip > Android(Java, Kotlin)' 카테고리의 다른 글
[kotlin] 확장함수를 이용한 간편한 AlphaAnimation (0) | 2021.06.21 |
---|---|
[gradle] java 버전에러 - if 문 처리 (e: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException) (2) | 2021.06.17 |
[Android] PopupWindow 사용 - closure 예제 (0) | 2021.05.30 |
화면 회전시 Layout 변경 (0) | 2021.05.22 |
[kotlin] Coroutine 취소방법 - Job을 이용한 2가지 (0) | 2021.05.17 |
Comments