Apple is Apple
Published 2023. 7. 31. 17:12
[Kotlin] Scope function Language/Kotlin

Scope function

Kotlin에서 제공하는 Scope function이다.

주로 객체와 함께 사용되며 편리하고 간결한 코드 작성을 도와준다.

간결한 코드 작성을 위해 필수적으로 알아두면 좋은 챕터라고 생각한다.

 

이름에서 알 수 있듯이 이 함수를 호출하면 Scope가 생기게 되고 이 Scope안에서는 전달된 객체가

"it" 또는 "this"라는 이름의 Context Object로 사용할 수 있게 된다.

 

Scope function 총 5가지가 있는데 함수마다 Context Object(전달된 객체)를 참조하는 방법과 리턴 값(Context Object or lambda)이 상이하다.

 

1. let

let은 null이 아닌 값만 실행시키고 싶을 때 주로 사용된다. 그래서 let은?. 연산자와 같이 사용되는 경우가 많다.

Scope에는 it으로 전달하고 수행된 결과(lambda)를 반환한다. 

val student = Student?.let {
    it.name = "James"
    it.grade = 3
    it.grade // 반환 값
}

 

2. with

with는 Scope에 this로 전달하여 내부 로직을 실행하고 실행된 결과(lambda)를 반환한다.

null이 아닌 객체를 사용하므로 반드시 null이 아닐 때만 사용한다.

val student = Student("길동", 3)
with(student) {
    println(name) // this.name
    println(grade) // this.grade
}

 

3. also

also는 Scope에 it으로 전달하여 로직을 실행하고 Context Object(객체 자체)를 반환한다.

객체의 유효성을 확인하거나 디버깅등 부가적인 목적으로 주로 사용한다.

val numbers = mutableListOf("one", "two", "three")
numbers.also { println("새 항목 추가하기 전 리스트 요소들: $it") }
       .add("four")

 

4. apply

apply는 Scope에 this로 전달하여 로직을 실행하고 ContextObject(객체 자체)를 반환한다.

주로 객체의 상태를 바꾸거나 초기화할 때 사용한다.

val student = Student("길동", 3)
var result = student?.apply {
    name = "지수"
}

5. run

run은 두 가지 형태가 있다.

 

1. 객체에서 호출할 때

with처럼 객체를 받아 로직을 실행한 후(Scope에서 this로 사용) 실행된 결과(lambda)를 반환한다.

어떤 값을 계산할 필요가 있거나, 여러 개의 지역변수 범위를 제한할 때 사용한다.

그리고 with와 달리 null 체크를 수행할 수 있어 안전하게 사용가능하다.

val student = Student("길동", 3)
var result = student?.run {
    goToClassroom()
}

 

2. 객체에서 호출하지 않을 때

 - 이 때는 확장함수가 아니고, Scope에 객체를 전달받아서 속성을 바꾸는 그런 형식이 아니다.

 - 단지 객체 생성이나 기타 명령문을 블록 안에 묶는 역할을 한다.

var totalGrade = run {
    var korean = 100
    var math = 80

    korean + math
}
println(totalGrade)

함수의 Scope 내 수신 객체와 return을 표로 정리하면 다음과 같다.

Scope function 수신 객체 return
let it lambda result
with this lambda result
also it context object
apply this context object
run this lambda result
run - lambda result

 

Scope function을 통해 간결하고 빠르게 코드를 작성해보자

'Language > Kotlin' 카테고리의 다른 글

더블 콜론 참조(::)  (0) 2024.05.09
URL Encoding  (0) 2024.04.02
[Kotlin] Coroutine  (2) 2024.03.07
Sealed Class  (0) 2023.09.15
profile

Apple is Apple

@mjjjjjj