유용한 표준 함수 (apply, let, run, with, also) - swkim0128/PARA GitHub Wiki

코틀린에서는 객체 조작 및 코드 가독성을 향상시키기 위해 다양한 **스코프 함수(Scope Function)**를 제공한다. 대표적으로 apply, let, run, with, also가 있으며, 각각의 역할과 특징이 다르다.

1. 표준 함수 개요

함수 반환값 객체 참조 방식 사용 목적
apply 객체 자체 this 객체의 속성을 변경 후 반환
let 람다 결과 값 it 객체 변환, 널 안정성 처리
run 람다 결과 값 this 객체를 사용한 작업 실행 후 결과 반환
with 람다 결과 값 this 특정 객체의 연산 수행 후 결과 반환
also 객체 자체 it 객체를 참조하여 부가적인 작업 수행

2. apply - 객체 설정 및 반환

apply는 객체의 속성을 변경하고, 해당 객체를 반환하는 함수이다. 보통 객체를 생성한 후 속성을 설정할 때 사용한다.

예제

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

fun main() {
    val user = User("John", 25).apply {
        name = "Alice"
        age = 30
    }
    println(user) // 출력: User(name=Alice, age=30)
}

✅ 객체 속성을 변경한 후 객체 자체를 반환하므로, 변수 할당이 가능하다. ✅ 코드가 간결해지고, 객체 초기화 코드와 변수 할당이 분리되지 않는다.

3. let - 널 처리 및 객체 변환

let은 객체를 변환하거나 널(null) 체크를 할 때 유용하다. 람다의 결과 값을 반환하며, 객체는 it 키워드로 참조한다.

예제 1: let을 활용한 변환

fun main() {
    val name = "Kotlin".let {
        it.uppercase()
    }
    println(name) // 출력: KOTLIN
}

예제 2: let을 활용한 널 안전성 처리

fun main() {
    val name: String? = "Kotlin"
    
    name?.let {
        println("이름: $it") // 출력: 이름: Kotlin
    }
}

✅ let은 null이 아닌 경우에만 실행되므로, ?.let {}을 활용하면 널 체크를 쉽게 할 수 있다. ✅ 객체를 변환하는 용도로도 활용할 수 있다.

4. run - 객체 실행 및 결과 반환

run은 객체를 사용하여 특정 작업을 실행하고, 그 결과를 반환한다. apply와 비슷하지만, 반환값이 람다의 실행 결과라는 점이 다르다.

예제 1: 객체 초기화 및 변환

fun main() {
    val user = User("Bob", 22)

    val message = user.run {
        "이름: $name, 나이: $age"
    }

    println(message) // 출력: 이름: Bob, 나이: 22
}

✅ 객체의 속성을 참조하면서 특정 결과를 도출할 때 사용한다. ✅ 반환값이 람다 내부의 실행 결과이므로, 특정 값을 생성할 때 유용하다.

5. with - 특정 객체에서 연산 수행 후 결과 반환

with는 객체를 특정 작업에 활용할 때 사용되며, run과 비슷하지만, 객체를 직접 받는 것이 아니라 인자로 전달한다.

예제

fun main() {
    val user = User("Charlie", 28)

    val info = with(user) {
        "이름: $name, 나이: $age"
    }

    println(info) // 출력: 이름: Charlie, 나이: 28
}

✅ 객체를 첫 번째 인자로 받고, 내부에서 this를 사용하여 속성을 참조할 수 있다. ✅ with는 객체를 직접 반환하지 않고, 특정 연산 결과를 반환하는 데 사용된다.

6. also - 부가 작업 수행 후 객체 반환

also는 객체를 변경하지 않으면서, 부가적인 작업(로깅, 디버깅 등)을 수행할 때 사용한다. apply와 비슷하지만, 객체를 it으로 참조한다.

예제

fun main() {
    val user = User("Dave", 35).also {
        println("새로운 사용자 생성: ${it.name}, 나이: ${it.age}")
    }
}

출력:

새로운 사용자 생성: Dave, 나이: 35

✅ 객체를 반환하지만, 원래 객체를 변경하지 않고 부가적인 작업을 수행하는 데 사용된다.

7. 표준 함수 비교 요약

함수 반환값 this / it 사용 목적
apply 객체 자체 this 객체의 속성을 변경 후 반환
let 람다 결과 값 it 객체 변환, 널 처리
run 람다 결과 값 this 특정 작업 실행 후 결과 반환
with 람다 결과 값 this 특정 객체에서 연산 수행 후 결과 반환
also 객체 자체 it 객체를 참조하여 부가 작업 수행

8. 언제 어떤 표준 함수를 사용할까?

  • 객체 설정 및 반환 → apply
  • 널 체크 및 변환 → let
  • 객체 실행 및 결과 반환 → run
  • 특정 객체에서 연산 수행 → with
  • 객체를 참조하여 로깅 또는 디버깅 → also

9. 결론

  • 코틀린 표준 함수(apply, let, run, with, also)는 코드 가독성을 높이고, 코드 중복을 줄이는 데 유용하다.
  • 각 함수의 반환값과 참조 방식(this / it)을 이해하면 적절한 상황에서 사용할 수 있다.
  • 널 체크(let), 객체 초기화(apply), 실행(run), 연산 수행(with), 부가 작업(also)을 적절히 활용하면 더 깔끔한 코드를 작성할 수 있다.

💡 이 표준 함수를 적절히 활용하면 더 간결하고 효율적인 코드를 작성할 수 있다! 🚀

⚠️ **GitHub.com Fallback** ⚠️