[kotlin] 널 타입의 스코프 함수 사용 예시

이번에는 Kotlin에서 자주 사용되는 널 타입의 스코프 함수인 let, run, with, apply, also에 대해 알아보겠습니다.

1. let 함수

val name: String? = "john"
name?.let {
    println("Name is $it")
}

let 함수는 수신 객체가 널이 아닌 경우에만 람다 함수를 실행합니다. 위의 예시에서 만약 name이 널이 아니라면 람다 함수가 실행되어 “Name is john”이 출력됩니다.

2. run 함수

val person: Person? = Person("john", 25)
val nameLength = person?.run {
    println("Person name: $name")
    name.length
}

run 함수는 수신 객체가 널이 아닌 경우에 람다 함수를 실행하고 그 결과를 반환합니다. 위의 예시에서 person이 널이 아니라면 람다 함수가 실행되어 “Person name: john”이 출력되고 name.length의 결과가 nameLength에 저장됩니다.

3. with 함수

val numbers: List<Int>? = listOf(1, 2, 3, 4, 5)
val evenSum = with(numbers) {
    this?.filter { it % 2 == 0 }?.sum()
}

with 함수는 수신 객체를 람다 함수의 수신자로 만들어 람다 함수를 호출합니다. 위의 예시에서 numbers가 널이 아니라면 람다 함수 내부에서 해당 리스트의 요소 중 짝수만 필터링하여 합계를 반환합니다.

4. apply 함수

val person: Person? = Person("john", 25)
person?.apply {
    age += 1
}.also {
    println("Updated age: ${it?.age}")
}

apply 함수는 수신 객체에 람다 함수를 호출한 후 그 객체를 반환합니다. 위의 예시에서 person이 널이 아니라면 람다 함수 내부에서 나이를 1 증가시키고, 그 결과를 출력합니다.

5. also 함수

val message: String? = "Hello, World!"
val length = message?.also {
    println("Length of the message: ${it.length}")
}?.length

also 함수는 수신 객체를 인자로 받아 처리한 후 그 객체를 반환합니다. 위의 예시에서 message가 널이 아니라면 람다 함수 내부에서 메시지의 길이를 출력하고, 그 길이를 length에 저장합니다.

위에서 소개된 스코프 함수들은 널 타입에 안전하게 적용할 수 있어 코드의 가독성을 높이고 예외를 방지하는데 도움을 줍니다.

더 많은 정보를 원하시면 Kotlin 공식 문서를 참고하세요.