-
[Kotlin] apply, run, with, let, alsocode 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