code

[Kotlin] apply, run, with, let, also

sinply 2025. 3. 10. 09:55
반응형
SMALL

Kotlin의 apply, run, with, let, also는 스코프 함수(Scope Functions) 로 불리며, 객체에 대해 특정 블록을 실행할 때 사용됩니다.

각 함수의 차이를 한 번에 이해할 수 있도록 정리하고, Spring Boot(Kopring) 환경에서 사용할 수 있는 예제도 함께 설명해드릴게요.

1. apply

객체를 구성할 때 사용

• this를 반환 (즉, 원래 객체를 그대로 반환)

• 주로 객체 초기화에 사용

✅ 예제

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

val user = User("John", 25).apply {
    name = "Mike"
    age = 30
}
println(user) // User(name=Mike, age=30)

📌 Spring Boot 예제 (Entity 생성)

@Entity
class Member(
    var name: String,
    var email: String
) {
    fun updateName(newName: String) = apply {
        name = newName
    }
}

// 사용
val member = Member("Alice", "alice@example.com")
    .updateName("Bob") // apply 덕분에 연속 호출 가능

2. run

객체 초기화 + 추가 로직 실행

• this를 통해 객체를 조작

• 블록의 마지막 값을 반환

✅ 예제

val user = User("John", 25).run {
    name = "Mike"
    age = 30
    "Updated: $name, $age" // 반환 값
}
println(user) // Updated: Mike, 30

📌 Spring Boot 예제 (서비스 로직 내에서 가공 후 반환)

fun findMemberById(id: Long): String {
    return memberRepository.findById(id).orElseThrow()
        .run {
            "Member: $name, Email: $email"
        }
}

3. with

객체를 인자로 받아 내부에서 처리

• this 없이 속성 변경 가능

• 블록의 마지막 값을 반환

✅ 예제

val user = User("John", 25)
val result = with(user) {
    name = "Mike"
    age = 30
    "Updated: $name, $age" // 반환 값
}
println(result) // Updated: Mike, 30

📌 Spring Boot 예제 (DTO 변환 시 사용)

data class MemberDto(val name: String, val email: String)

fun Member.toDto(): MemberDto {
    return with(this) {
        MemberDto(name, email)
    }
}

4. let

null 체크가 필요할 때 사용 (Safe Call에 유용)

• it을 사용하여 객체 참조 가능

• 블록의 마지막 값을 반환

✅ 예제

val user: User? = User("John", 25)

user?.let {
    println("User name: ${it.name}")
} // User name: John

📌 Spring Boot 예제 (nullable한 값 가공)

fun findMemberByEmail(email: String): String {
    return memberRepository.findByEmail(email)?.let {
        "Found: ${it.name}"
    } ?: "Not Found"
}

5. also

객체를 그대로 반환하지만, 로깅이나 디버깅 용도로 활용

• it을 사용하여 객체 참조 가능

✅ 예제

val user = User("John", 25).also {
    println("User created: ${it.name}, ${it.age}")
}

📌 Spring Boot 예제 (로깅 및 모니터링)

fun saveMember(member: Member): Member {
    return memberRepository.save(member).also {
        log.info("Saved Member: ${it.name}")
    }
}

 

💡 한눈에 보기 (정리)

함수 반환값 this 사용 여부 it 사용 여부 주요 사용 목적

apply 원본 객체 객체 초기화
run 람다 결과 초기화 + 추가 로직 실행
with 람다 결과 DTO 변환 등 (객체 외부에서 호출)
let 람다 결과 null 체크 및 변환
also 원본 객체 로깅, 디버깅

이제 Spring Boot 환경에서도 스코프 함수를 잘 활용할 수 있겠죠? 😊

LIST