[Kotlin] apply, run, with, let, also
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 환경에서도 스코프 함수를 잘 활용할 수 있겠죠? 😊