ABOUT ME

sinply 님의 블로그 입니다.

Today
Yesterday
Total
  • [Kotlin] apply, run, with, let, also
    code 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

    'code' 카테고리의 다른 글

    [와인] 19 크라임스 쉬라즈  (3) 2025.03.17
    CoroutineScope - launch  (1) 2025.03.13
    CoroutineContext의 이해  (0) 2025.03.11
    Kotlin의 async & await 이해하기  (0) 2025.03.10
    @Qualifier 이란??  (0) 2025.03.09
Designed by Tistory.