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 |