[kotlin] 스코프 함수를 사용하여 컬렉션에 대한 조작을 간단하게 수행하기

코틀린은 스코프 함수를 사용하여 컬렉션에 대한 간단하고 효과적인 조작을 할 수 있다. 스코프 함수에는 apply, let, run, with, 및 also가 있다. 이러한 스코프 함수를 사용하면 코드 블록 내에서 객체의 속성을 쉽게 조작하고, null 체크 또는 연속된 함수 호출을 줄일 수 있다.

1. apply 함수

apply 함수는 수신 객체를 초기화하고 속성을 설정한 후 해당 객체를 반환한다. 주로 객체의 초기화 또는 구성에 사용된다.

data class Person(var name: String, var age: Int)

val person = Person("Alice", 25).apply {
    age = 30
}

apply 함수를 사용하면 객체를 생성하고 속성을 초기화 한 후 즉시 속성을 변경할 수 있다.

2. let 함수

let 함수는 수신 객체를 사용하여 결과를 반환하거나 다른 처리를 수행할 수 있다. null 안전성을 갖는 컬렉션의 항목에 대해서 안전하게 적용할 수 있다.

val numbers: List<Int?> = listOf(1, 2, null, 4)

val evenNumbers = numbers.mapNotNull { it?.times(2) }
    .let {
        println("Even numbers: $it")
        it.filter { it % 4 == 0 }
    }

let 함수를 사용하면 null이 아닌 값을 매핑하고, 결과를 처리하는 동시에 중간 결과를 출력할 수 있다.

3. run 함수

run 함수는 수신 객체에서 독립적인 코드 블록을 실행하고 결과를 반환한다. 함수 내에서 수신 객체의 함수 또는 속성에 쉽게 접근할 수 있다.

val message = run {
    val from = "Alice"
    val to = "Bob"
    "Hello, $to! - from $from"
}

run 함수를 사용하면 코드 블록 안에서 새로운 범위를 생성하고 결과를 반환할 수 있다.

4. with 함수

with 함수는 수신 객체의 함수 및 속성에 접근할 수 있는 범위를 제공한다. 단일 수신 객체에 대한 코드 블록을 실행할 때 유용하다.

val person = Person("Alice", 25)

val bio = with(person) {
    "Name: $name, Age: $age"
}

with 함수를 사용하면 person 객체의 범위 안에서 속성에 바로 접근하고 결과를 만들어낼 수 있다.

5. also 함수

also 함수는 수신 객체를 사용하여 추가적인 처리를 수행하거나 로깅할 때 사용한다. 주로 객체의 속성을 변경하지 않고 추가 작업을 수행할 때 유용하다.

val numbers = mutableListOf(1, 2, 3)

numbers.also {
    println("Elements before adding: $it")
}.add(4)

also 함수를 사용하여 numbers 컬렉션에 요소를 추가하기 전에 컬렉션의 현재 상태를 출력할 수 있다.

코틀린의 스코프 함수를 활용하여 컬렉션 조작을 간소화하고 더 읽기 쉬운 코드를 작성할 수 있으며, null 안전성을 갖춘 코드를 작성하는 데 도움이 된다.

참고 자료