밤빵's 개발일지
[TIL]20241026 apply, with, run 본문
apply, with, run 이 스코프 함수들은 객체에 대한 여러 작업을 간결하게 처리할 수 있도록 도와주고, 가독성을 높여주는 유용한 도구들이다. 처음 배우는 개념이지만, 코드를 보다 읽기 쉽고 효율적으로 작성하기 위해 알아두면 좋을 것 같아, 자세히 기록하기로 했다.
▶스코프 함수란?
코틀린의 스코프 함수는 객체에 대한 작업을 간결하고 일관되게 수행하기 위해 제공되는 함수들이다. 스코프 함수들은 객체의 컨텍스트 내에서 블록을 실행할 수 있게 해주고, 객체를 특정 범위 내에서 사용하도록 도와준다. 코틀린에서 자주 사용하는 스코프 함수로는 apply, with, run이 있다. 각각의 스코프 함수는 목적과 반환 값, 그리고 this나 it을 어떻게 사용하느냐에 따라 차이가 있다.
▶apply
apply 함수는 객체 설정을 할 때 유용하게 사용된다. apply는 객체를 생성하고 초기화할 때, 그 객체의 인스턴스를 반환하며 블록 내부에서는 this를 통해 해당 객체에 접근한다.
data class Person(var name: String, var age: Int)
fun main() {
val person = Person("John", 30).apply {
name = "Doe"
age = 25
}
println(person) // 출력: Person(name=Doe, age=25)
}
▷특징
- 반환 값은 객체 그 자체이다.
- 주로 객체의 초기화나 설정을 할 때 사용한다.
- 블록 내부에서 this 키워드를 통해 객체의 속성에 접근한다.
▷사용 사례
- 객체의 프로퍼티를 한 번에 설정할 때.
- 객체를 초기화하면서 반환할 때.
▶with
with 함수는 객체의 여러 작업을 하나의 블록으로 묶을 때 유용하다. with는 주어진 객체를 수신 객체로 사용하지만, 반환 값은 블록의 결과이다.
data class Person(var name: String, var age: Int)
fun main() {
val person = Person("Jane", 28)
with(person) {
name = "Alice"
age += 2
println("Name is $name and age is $age")
}
}
▷특징
- 반환 값은 블록의 결과이다.
- 주어진 객체에 대해 여러 작업을 수행할 때 유용하다.
- 블록 내부에서는 this 키워드를 생략하고 객체의 속성에 접근할 수 있다.
▷사용 사례
- 객체에 대해 여러 작업을 수행하고, 최종적인 결과 값을 반환할 때.
- 객체의 속성을 읽거나 변경하는 작업을 일괄적으로 처리할 때.
▶run
run 함수는 주로 객체의 초기화나 특정 작업을 실행하고 그 결과를 반환할 때 사용된다. run은 let과 비슷하지만, let은 it을 사용해 접근하고, run은 this를 사용한다.
fun main() {
val greeting = run {
val name = "Kotlin"
"Hello, $name"
}
println(greeting) // 출력: Hello, Kotlin
}
또한 객체에 대해 사용할 수도 있다.
data class Person(var name: String, var age: Int)
fun main() {
val person = Person("Jane", 22)
val result = person.run {
age += 5
"Updated age is $age"
}
println(result) // 출력: Updated age is 27
}
▷특징
- 반환 값은 블록의 결과이다.
- 객체의 초기화나 특정 작업을 수행할 때 유용하다.
- 블록 내부에서 this를 사용해 객체의 속성에 접근한다.
▷사용 사례
- 특정 작업의 결과를 반환할 때.
- 객체의 초기화와 작업 결과를 반환할 때.
▶스코프 함수들의 차이점 정리
함수 | 반환 값 | 수신 객체 접근 방식 | 주 사용 목적 |
apply | 객체 자체 | this | 객체 초기화 및 설정 |
with | 블록의 결과 | this | 여러 작업 수행 후 결과 반환 |
run | 블록의 결과 | this | 특정 작업의 결과 반환 및 초기화 |
▶적절한 스코프 함수 선택 기준
- 객체 설정이 필요한 경우: apply를 사용하여 객체를 초기화하면서 반환할 수 있다.
- 여러 작업을 일괄 처리하고 특정 결과를 반환해야 할 경우: with를 사용하면 코드가 더 간결해진다.
- 특정 작업의 결과를 반환하고 싶다면: run을 사용하여 원하는 결과를 얻을 수 있다.
▶예시를 통한 이해
data class Book(var title: String, var author: String)
fun main() {
// apply 예시
val myBook = Book("Old Title", "Author Name").apply {
title = "New Title"
}
println(myBook) // 출력: Book(title=New Title, author=Author Name)
// with 예시
val bookDescription = with(myBook) {
"The book '$title' is written by $author."
}
println(bookDescription) // 출력: The book 'New Title' is written by Author Name.
// run 예시
val message = myBook.run {
title = "Final Title"
"Updated to '$title'"
}
println(message) // 출력: Updated to 'Final Title'
}
이 함수들은 객체를 다루는 데 있어서 코드의 가독성을 높이고, 효율적인 프로그래밍을 가능하게 한다. 각 스코프 함수는 특정 상황에서 유용하게 사용될 수 있고, 목적에 따라 적절히 선택하는 것이 중요하다. 코드를 더 직관적이고 간결하게 만들기 위해서는 이 스코프 함수들을 잘 활용하는 것이 좋다.
'Kotlin' 카테고리의 다른 글
[TIL]20241028 by 와 Delegation (1) | 2024.10.28 |
---|---|
[TIL]20241027 sealed class 와 Enum (0) | 2024.10.27 |
[TIL]20241025 오버로딩 & 오버라이딩 (1) | 2024.10.25 |
[TIL]20241024 Type-Safe Builder (0) | 2024.10.24 |
[TIL]20241023 Infix Function (3) | 2024.10.23 |