[Android] 3(10). 코틀린 기본 문법(스코프 함수)

2 minute read


스코프 함수

스코프 함수(영역 함수)는 코드를 축약해서 표현할 수 있도록 도와주는 함수이며 lateinit과 함께 Safe Call 남용을 막아주는 역할도 하기 때문에 많이 사용하는 요소입니다.

사용법은 함수처럼 쓰지 않고 run, let, apply, also, with 의 키워드와 함께 괄호 없이 일종의 키워드 같이 사용합니다.


run과 let으로 보는 스코프 함수


run과 let은 자신의 함수 스코프(코드 블록) 내에서 호출한 대상을 this와 it으로 대체해서 사용할 수 있습니다.

run

스코프 함수 안에서 호출한 대상을 this로 사용할 수 있습니다. 클래스 내부의 함수를 사용하는 것과 동일한 효과이기 때문에 this를 생략하고 메서드나 프로퍼티를 바로 사용할 수 있습니다.

👍 예제

var list = mutableListOf("Scope", "Function")
list.run{
    val listSize = size // list.size 또는 this.size
    println("리스트의 길이 run = $listSize")
}


let

함수 영역 내에서 호출한 대상을 it으로 사용할 수 있습니다.

it을 생략할 수는 없지만 target 등 다른 이름으로 바꿀 수 있습니다.

var list = mutableListOf("Scope", "Function")
list.let{ // it -> 생략된 형태. it -> 대신에 target -> 등으로 변경 가능
    val listSize = it.size // 모든 속성과 함수를 it.멤버로 사용할 수 있습니다. 
    println("리스트의 길이 let = $listSize")
}


this와 it으로 구분하기


this로 사용되는 스코프 함수: run, apply, with

var list = mutableListOf("Scope", "Function")
//run
list.run{
    val listSize = size
    println("리스트의 길이 run = $listSize")
}
// apply
list.let{
    val listSize = size
    println("리스트의 길이 let = $listSize")
}
// with
with(list){
    val listSize = size
    println("리스트의 길이 let = $listSize")
}

주의 사항

with는 스코프 함수이긴 하지만 run과 apply와는 다르게 확장(Extension) 함수가 아니기 때문에 일반 함수처럼 사용합니다. 따라서 호출하는 대상이 null일 경우에는 with보다는 apply나 run을 사용하는 것이 효율적입니다.

target?.apply{ /*코드*/ }


it으로 사용되는 스코프 함수: let, also

var list = mutableListOf("Scope", "Function")
// let
list.let{ 
    val listSize = it.size
    println("리스트의 길이 let = $listSize")
}
//also
list.also{ 
    val listSize = it.size 
    println("리스트의 길이 let = $listSize")
}



반환값으로 구분하기


동일하게 this 또는 it로 사용되는 함수라도 대입 연산자를 사용해서 값을 반환할 경우에는 용도가 달라집니다.

결괏값을 반환할 경우, 스코프가 종료되는 시점에서의 반환값이 다르기 때문에 서로 다른 역할을 하는 스코프 함수가 필요합니다.

호출 대상인 this 자체를 반환하는 스코프 함수: apply, also

apply(또는 also)를 사용하면 스코프 함수 안에서 코드가 종료된 후 자기 자신을 되돌려줍니다. 아래 코드에서 apply 스코프의 마지막 줄에서 count() 함수를 호출했지만 마지막 코드와 상관없이 그냥 MutableList 자신을 돌려주기 때문에 Scope, Function 에 Apply가 추가된 리스트가 출력됩니다.

var list = mutableListOf("Scope", "Function")

val afterApply = list.apply{
    add("Apply")
    count()
}

println("반환값 also = $afterApply")

out:
	반환값 apply = [Scope, Function, Apply]


마지막 실행 코드를 반환하는 스코프 함수: let, run, with

let(또는 run, with)은 자기 자신이 아닌 스코프의 마지막 코드를 반환합니다.

var list = mutableListOf("Scope", "Function")

val lastCount = list.let{
    it.add("Run")
    it.count()
}

println("반환값 let = $lastCount")

out:
	반환값 let = 3



정리


  • 스코프 함수(영역 함수)는 코드를 축약해서 표현할 수 있도록 도와주는 함수이며 lateinit과 함께 Safe Call 남용을 막아주는 역할도 하기 때문에 많이 사용하는 요소입니다.
  • 스코프 함수는 함수처럼 쓰지 않고 run, let, apply, also, with 의 키워드와 함께 괄호 없이 일종의 키워드 같이 사용합니다.
키워드\특징 사용법 호출한 대상 참조 반환값
run var 변수 = 호출대상.run{ } this(또는 생략) 마지막 실행 코드
let var 변수 = 호출대상.let{ } it 마지막 실행 코드
apply var 변수 = 호출대상.apply{ } this(또는 생략) 호출 대상
also var 변수 = 호출대상.also{ } it 호출 대상
with var 변수 = with(호출대상){ } this(또는 생략) 마지막 실행 코드

Categories:

Updated:

Leave a comment